Back to index

salome-med  6.5.0
create_mesh_c3h8.c
Go to the documentation of this file.
00001 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
00004 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
00005 //
00006 // This library is free software; you can redistribute it and/or
00007 // modify it under the terms of the GNU Lesser General Public
00008 // License as published by the Free Software Foundation; either
00009 // version 2.1 of the License.
00010 //
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // Lesser General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU Lesser General Public
00017 // License along with this library; if not, write to the Free Software
00018 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00019 //
00020 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00021 //
00022 
00023 /*
00024   creation d'une geometrie 3d : un cube [0,1]^3
00025   maillé uniformement en hexahedres reguliers;
00026   avec n (=argv[1]) noeuds dans chaque direction.
00027   2 champs:
00028   - DbleVectNode champ vectoriel reel sur les noeuds
00029   - DbleVectCell champ vectoriel reel sur les cellules
00030 
00031   En sortie, il y aura production d'un fichier MED
00032   cube_hexa8_n.med qui contiendra un seul maillage et 2 champs
00033   avec une seule famille la FAMILLE_0
00034 */
00035 
00036 #include <med.h>
00037 #include <string.h>
00038 #include <stdlib.h>
00039 
00040 #include <time.h>
00041 
00042 int main (int argc, char **argv)
00043 {
00044   med_err ret;
00045   med_idt fid;
00046   char maa[MED_TAILLE_NOM+1] = "cube_hexa8";
00047   med_int mdim = 3;
00048 
00049   int nnoe_dir;
00050   int nelt_dir;
00051   med_int nnoe;
00052   int i, j, k, ijk;
00053 
00054   med_float * coo;
00055   med_int * numnoe;
00056   med_int * nufano;
00057 
00058   med_float hxsize;
00059   med_float hysize;
00060   med_float hzsize;
00061 
00062   med_float * DbleVectNode;
00063   med_float * DbleVectCell;
00064 
00065   time_t t1;
00066 
00067   /*
00068     Le maillage
00069    */
00070 
00071   char nomcoo[3*MED_TAILLE_PNOM+1] = "x       y       z       ";
00072   char unicoo[3*MED_TAILLE_PNOM+1] = "cm      cm      cm      ";
00073   /*  char nomnoe[19*MED_TAILLE_PNOM+1] = "nom1    nom2    nom3    nom4";*/
00074   char *nomnoe ;
00075 
00076   med_int nhexa8;
00077   med_int * hexa8;
00078   med_int * numhexa8;
00079   med_int * nufahexa8;
00080 
00081   char * nomhexa8;
00082   int indexN1, indexN2, indexN3, indexN4, indexN5, indexN6, indexN7, indexN8;
00083 
00084   char nomfam[MED_TAILLE_NOM+1];
00085   med_int numfam;
00086   char attdes[MED_TAILLE_DESC+1];
00087   med_int natt;
00088   med_int attide;
00089   med_int attval;
00090   med_int ngro;
00091   char gro[MED_TAILLE_LNOM+1];
00092   int nfame = 0; 
00093   int nfamn = 0;
00094 
00095   char MedFile[100] = "cube_hexa8_";
00096   char buff[100];
00097 
00098   /*
00099     Les champs
00100   */
00101 
00102   char champDbleVectNode[MED_TAILLE_NOM+1] = "DbleVectNode";
00103   char compDbleVectNode[MED_TAILLE_PNOM*3+1] = "comp1   comp2   comp3   " ;
00104   char unitDbleVectNode[MED_TAILLE_PNOM*3+1] = "unit1   unit2   unit3   " ;
00105 
00106   char champDbleVectCell[MED_TAILLE_NOM+1] = "DbleVectCell";
00107   char compDbleVectCell[MED_TAILLE_PNOM*3+1] = "comp1   comp2   comp3   " ;
00108   char unitDbleVectCell[MED_TAILLE_PNOM*3+1] = "unit1   unit2   unit3   " ;
00109 
00110   if (argc != 2)
00111     {
00112       printf("Usage: %s <n> \n",argv[0]);
00113       printf("       where\n");
00114       printf("       - n is the number of nodes in each direction.\n");
00115       printf("\n");
00116       printf("This program will produce a MED file cube_hexa8_n.med\n");
00117       exit(0);
00118     }
00119 
00120   nnoe_dir = atoi(argv[1]);
00121   nelt_dir = nnoe_dir-1;
00122   nnoe = nnoe_dir*nnoe_dir*nnoe_dir;
00123 
00124   coo = malloc(mdim*nnoe*sizeof(med_float));
00125   numnoe = malloc(nnoe*sizeof(med_int));
00126   nufano = malloc(nnoe*sizeof(med_int));
00127   nomnoe = malloc((MED_TAILLE_PNOM*nnoe+1)*sizeof(char));
00128 
00129   hxsize = 1./((med_float) (nnoe_dir - 1));
00130   hysize = hxsize;
00131   hzsize = hxsize;
00132 
00133   nhexa8 = nelt_dir*nelt_dir*nelt_dir;
00134   hexa8 = malloc(8*nhexa8*sizeof(med_int));
00135   numhexa8 = malloc(nhexa8*sizeof(med_int));
00136   nufahexa8 = malloc(nhexa8*sizeof(med_int));
00137   nomhexa8 = malloc((MED_TAILLE_PNOM*nhexa8+1)*sizeof(char));
00138 
00139   DbleVectNode = malloc(mdim*nnoe*sizeof(med_float));
00140   DbleVectCell = malloc(mdim*nhexa8*sizeof(med_float));
00141 
00142   /*
00143     les noeuds:
00144   */
00145 
00146   for(k=0;k<nnoe_dir;k++)
00147     {
00148       for(j=0;j<nnoe_dir;j++)
00149         {
00150           for (i=0;i<nnoe_dir;i++)
00151             {
00152               int ijk = k*nnoe_dir*nnoe_dir+j*nnoe_dir+i;
00153 
00154               numnoe[ijk] = ijk+1;
00155               nufano[ijk] = 0;
00156 
00157               coo[mdim*ijk] = ((med_float) i)*hxsize;
00158               coo[mdim*ijk+1] = ((med_float) j)*hysize;
00159               coo[mdim*ijk+2] = ((med_float) k)*hzsize;
00160 
00161               /*
00162               printf("Coordonnées %d   X = %lf  Y = %lf  Z = %lf\n",(ijk+1),coo[mdim*ijk],coo[mdim*ijk+1],coo[mdim*ijk+2]);
00163               */
00164             }
00165         }
00166     }
00167 
00168   /*
00169     les elements:
00170   */
00171 
00172   for(k=0;k<nelt_dir;k++)
00173     {
00174       for(j=0;j<nelt_dir;j++)
00175         {
00176           for (i=0;i<nelt_dir;i++)
00177             {
00178               int ijk = k*nelt_dir*nelt_dir+j*nelt_dir+i;
00179 
00180               numhexa8[ijk] = ijk+1;
00181               nufahexa8[ijk] = 0;
00182 
00183               indexN5 = k*nnoe_dir*nnoe_dir+j*nnoe_dir+i+1;
00184               indexN8 = indexN5+1;
00185               indexN1 = indexN5+nnoe_dir;
00186               indexN4 = indexN8+nnoe_dir;
00187 
00188               indexN6 = indexN5+nnoe_dir*nnoe_dir;
00189               indexN7 = indexN8+nnoe_dir*nnoe_dir;
00190               indexN2 = indexN1+nnoe_dir*nnoe_dir;
00191               indexN3 = indexN4+nnoe_dir*nnoe_dir;
00192 
00193               hexa8[8*ijk] = indexN1;
00194               hexa8[8*ijk+1] = indexN2;
00195               hexa8[8*ijk+2] = indexN3;
00196               hexa8[8*ijk+3] = indexN4;
00197               hexa8[8*ijk+4] = indexN5;
00198               hexa8[8*ijk+5] = indexN6;
00199               hexa8[8*ijk+6] = indexN7;
00200               hexa8[8*ijk+7] = indexN8;
00201 
00202               /*
00203               printf("Connectivitée %d  i1 = %d  i2 = %d  i3 = %d  i4 = %d  i5 = %d  i6 = %d  i7 = %d  i8 = %d\n",(ijk+1),hexa8[8*ijk],hexa8[8*ijk+1],hexa8[8*ijk+2],hexa8[8*ijk+3],hexa8[8*ijk+4],hexa8[8*ijk+5],hexa8[8*ijk+6],hexa8[8*ijk+7]);
00204               */
00205             }
00206         }
00207     }
00208 
00209   /*
00210     Les champs
00211   */
00212 
00213   (void) time(&t1);
00214   
00215    srand((int) t1); /* use time in seconds to set seed */  
00216 
00217    for(i=0;i<nnoe;i++)
00218      {
00219        DbleVectNode[mdim*i] = (med_float)
00220          (1+(int) (100.0*rand()/(RAND_MAX+1.0)));
00221 
00222        DbleVectNode[mdim*i+1] = (med_float)
00223          (1+(int) (100.0*rand()/(RAND_MAX+1.0)));
00224 
00225        DbleVectNode[mdim*i+2] = (med_float)
00226          (1+(int) (100.0*rand()/(RAND_MAX+1.0)));
00227 
00228        /*
00229          printf("i %d DbleVectNode %lf %lf\n",i,DbleVectNode[mdim*i],
00230          DbleVectNode[mdim*i+1],DbleVectNode[mdim*i+2]);
00231        */
00232      }
00233 
00234    for(i=0;i<nhexa8;i++)
00235      {
00236        DbleVectCell[mdim*i] = (med_float)
00237          (1+(int) (100.0*rand()/(RAND_MAX+1.0)));
00238 
00239        DbleVectCell[mdim*i+1] = (med_float)
00240          (1+(int) (100.0*rand()/(RAND_MAX+1.0)));
00241 
00242        DbleVectCell[mdim*i+2] = (med_float)
00243          (1+(int) (100.0*rand()/(RAND_MAX+1.0)));
00244 
00245        /*
00246          printf("i %d DbleVectCell %lf %lf\n",i,DbleVectCell[mdim*i],
00247          DbleVectCell[mdim*i+1],DbleVectCell[mdim*i+2]);
00248        */
00249      }
00250 
00251   /***************************************************************************/
00252 
00253   sprintf(buff,"%d",nnoe_dir);
00254   strcat(MedFile,buff);
00255   strcat(MedFile,".med");
00256 
00257   fid = MEDouvrir(MedFile,RDWR);
00258 
00259   if (fid < 0)
00260     ret = -1;
00261   else
00262     ret = 0;
00263   printf("%d\n",ret);
00264 
00265   /***************************************************************************/
00266 
00267   if (ret == 0)
00268     ret = MEDmaaCr(fid,maa,mdim);
00269   printf("%d\n",ret);
00270 
00271   if (ret == 0)
00272     ret = MEDunvCr(fid,maa);
00273   printf("%d\n",ret);
00274 
00275   /***************************************************************************/
00276 
00277   if (ret == 0)
00278     ret = MEDnoeudsEcr(fid,maa,mdim,coo,MED_FULL_INTERLACE,MED_CART,
00279                        nomcoo,unicoo,nomnoe,MED_FAUX,numnoe,MED_VRAI,
00280                        nufano,nnoe,WRONLY);
00281   printf("%d\n",ret);
00282 
00283   /*
00284     ecriture des mailles MED_HEXA8 :
00285     - connectivite
00286     - noms (optionnel) 
00287     - numeros (optionnel)
00288     - numeros des familles
00289   */
00290 
00291   if (ret == 0) 
00292     ret = MEDelementsEcr(fid,maa,mdim,hexa8,MED_FULL_INTERLACE,
00293                          nomhexa8,MED_FAUX,numhexa8,MED_VRAI,nufahexa8,nhexa8,
00294                          MED_MAILLE,MED_HEXA8,MED_NOD,WRONLY);
00295   printf("%d \n",ret);
00296 
00297   /***************************************************************************/
00298   /* ecriture des familles */
00299   /* Conventions :
00300      - toujours creer une famille de numero 0 ne comportant aucun attribut
00301        ni groupe (famille de reference pour les noeuds ou les elements
00302        qui ne sont rattaches a aucun groupe ni attribut)
00303      - les numeros de familles de noeuds sont > 0
00304      - les numeros de familles des elements sont < 0
00305      - rien d'imposer sur les noms de familles
00306    */ 
00307 
00308   /* la famille 0 */
00309   if (ret == 0)
00310     {
00311       strcpy(nomfam,"FAMILLE_0");
00312       numfam = 0;
00313       ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,0,
00314                      gro,0);
00315     }
00316   printf("%d \n",ret);
00317 
00318   /***************************************************************************/
00319   /*
00320     Les Champs
00321   */
00322 
00323   if (ret == 0)
00324     {
00325       ret = MEDchampCr(fid,champDbleVectNode,MED_REEL64,compDbleVectNode,
00326                        unitDbleVectNode,mdim);
00327 
00328       printf("MEDchampCr DbleVectNode : %d \n",ret);
00329 
00330       if (ret == 0)
00331         {
00332           ret = MEDchampEcr(fid, maa, champDbleVectNode,
00333                             (unsigned char *)DbleVectNode,
00334                             MED_NO_INTERLACE, nnoe,
00335                             MED_NOPG, MED_ALL, MED_NOPFL, WRONLY, MED_NOEUD, 
00336                             0, MED_NOPDT,"        ", 0., MED_NONOR);
00337         
00338           printf("MEDchampEcr DbleVectNode : %d \n",ret);
00339         }
00340     }
00341 
00342   if (ret == 0)
00343     {
00344       ret = MEDchampCr(fid,champDbleVectCell,MED_REEL64,compDbleVectCell,
00345                        unitDbleVectCell,mdim);
00346 
00347       printf("MEDchampCr DbleVectCell : %d \n",ret);
00348 
00349       if (ret == 0)
00350         {
00351           ret = MEDchampEcr(fid, maa, champDbleVectCell,
00352                             (unsigned char *)DbleVectCell,
00353                             MED_NO_INTERLACE, nhexa8,
00354                             MED_NOPG, MED_ALL, MED_NOPFL, WRONLY, MED_MAILLE,
00355                             MED_HEXA8, MED_NOPDT,"        ", 0., MED_NONOR);
00356         
00357           printf("MEDchampEcr DbleVectCell : %d \n",ret);
00358         }
00359     }
00360 
00361   /***************************************************************************/
00362 
00363   ret = MEDfermer(fid);
00364   printf("%d\n",ret);
00365   
00366   free(coo);
00367   free(numnoe);
00368   free(nufano);
00369   free(nomnoe);
00370   free(hexa8);
00371   free(numhexa8);
00372   free(nufahexa8);
00373   free(nomhexa8);
00374   free(DbleVectNode);
00375   free(DbleVectCell);
00376 
00377   return 0;
00378 }
00379 
00380