Back to index

salome-med  6.5.0
create_mesh_c2q4.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 2d : un cube [0,1]^2
00025   maillé uniformement en quadrangle 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   carre_quad4_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] = "carre_quad4";
00047   med_int mdim = 2;
00048   int nnoe_dir;
00049   int nelt_dir;
00050   med_int nnoe;
00051   int i, j, ij;
00052 
00053   med_float * coo;
00054   med_int * numnoe;
00055   med_int * nufano;
00056 
00057   med_float hxsize;
00058   med_float hysize;
00059 
00060   med_float * DbleVectNode;
00061   med_float * DbleVectCell;
00062 
00063   time_t t1;
00064 
00065   /*
00066     Le maillage
00067    */
00068 
00069   char nomcoo[2*MED_TAILLE_PNOM+1] = "x       y       ";
00070   char unicoo[2*MED_TAILLE_PNOM+1] = "cm      cm      ";
00071   /*  char nomnoe[19*MED_TAILLE_PNOM+1] = "nom1    nom2    nom3    nom4";*/
00072   char *nomnoe ;
00073 
00074   med_int nquad4;
00075   med_int * quad4;
00076   med_int * numquad4;
00077   med_int * nufaquad4;
00078   /* char nomquad4[MED_TAILLE_PNOM*4+1] = "quad1   quad2   quad3   quad4   ";*/
00079   char * nomquad4;
00080   int indexN1, indexN2, indexN3, indexN4;
00081 
00082   char nomfam[MED_TAILLE_NOM+1];
00083   med_int numfam;
00084   char attdes[MED_TAILLE_DESC+1];
00085   med_int natt;
00086   med_int attide;
00087   med_int attval;
00088   med_int ngro;
00089   char gro[MED_TAILLE_LNOM+1];
00090   int nfame = 0; 
00091   int nfamn = 0;
00092 
00093   char MedFile[100] = "carre_quad4_";
00094   char buff[100];
00095 
00096   /*
00097     Les champs
00098   */
00099 
00100   char champDbleVectNode[MED_TAILLE_NOM+1] = "DbleVectNode";
00101   char compDbleVectNode[MED_TAILLE_PNOM*2+1] = "comp1   comp2   " ;
00102   char unitDbleVectNode[MED_TAILLE_PNOM*2+1] = "unit1   unit2   " ;
00103 
00104   char champDbleVectCell[MED_TAILLE_NOM+1] = "DbleVectCell";
00105   char compDbleVectCell[MED_TAILLE_PNOM*2+1] = "comp1   comp2   " ;
00106   char unitDbleVectCell[MED_TAILLE_PNOM*2+1] = "unit1   unit2   " ;
00107 
00108   if (argc != 2)
00109     {
00110       printf("Usage: %s <n> \n",argv[0]);
00111       printf("       where\n");
00112       printf("       - n is the number of nodes in each direction.\n");
00113       printf("\n");
00114       printf("This program will produce a MED file carre_quad4_n.med\n");
00115       exit(0);
00116     }
00117 
00118   nnoe_dir = atoi(argv[1]);
00119   nelt_dir = nnoe_dir-1;
00120   nnoe = nnoe_dir*nnoe_dir;
00121 
00122   coo = malloc(mdim*nnoe*sizeof(med_float));
00123   numnoe = malloc(nnoe*sizeof(med_int));
00124   nufano = malloc(nnoe*sizeof(med_int));
00125   nomnoe = malloc((MED_TAILLE_PNOM*nnoe+1)*sizeof(char));
00126 
00127   hxsize = 1./((med_float) (nnoe_dir - 1));
00128   hysize = hxsize;
00129 
00130   nquad4 = nelt_dir*nelt_dir;
00131   quad4 = malloc(4*nquad4*sizeof(med_int));
00132   numquad4 = malloc(nquad4*sizeof(med_int));
00133   nufaquad4 = malloc(nquad4*sizeof(med_int));
00134   nomquad4 = malloc((MED_TAILLE_PNOM*nquad4+1)*sizeof(char));
00135 
00136   DbleVectNode = malloc(mdim*nnoe*sizeof(med_float));
00137   DbleVectCell = malloc(mdim*nquad4*sizeof(med_float));
00138 
00139   /*
00140     les noeuds:
00141   */
00142 
00143   for(j=0;j<nnoe_dir;j++)
00144     {
00145       for (i=0;i<nnoe_dir;i++)
00146         {
00147           int ij = j*nnoe_dir+i;
00148 
00149           numnoe[ij] = ij+1;
00150           nufano[ij] = 0;
00151 
00152           coo[mdim*ij] = ((med_float) i)*hxsize;
00153           coo[mdim*ij+1] = ((med_float) j)*hysize;
00154 
00155           /*
00156           printf("Coordonnées %d   X = %lf  Y = %lf\n",(ij+1),coo[mdim*ij],coo[mdim*ij+1]);
00157           */
00158         }
00159     }
00160 
00161   /*
00162     les elements:
00163   */
00164 
00165   for(j=0;j<nelt_dir;j++)
00166     {
00167       for (i=0;i<nelt_dir;i++)
00168         {
00169           int ij = j*nelt_dir+i;
00170 
00171           numquad4[ij] = ij+1;
00172           nufaquad4[ij] = 0;
00173 
00174           indexN4 = j*nnoe_dir+i+1;
00175           indexN3 = indexN4+1;
00176           indexN1 = indexN4+nnoe_dir;
00177           indexN2 = indexN3+nnoe_dir;
00178 
00179           quad4[4*ij] = indexN1;
00180           quad4[4*ij+1] = indexN2;
00181           quad4[4*ij+2] = indexN3;
00182           quad4[4*ij+3] = indexN4;
00183 
00184           /*
00185           printf("Connectivitée %d  i1 = %d  i2 = %d  i3 = %d  i4 = %d\n",(ij+1),quad4[4*ij],quad4[4*ij+1],quad4[4*ij+2],quad4[4*ij+3]);
00186           */
00187 
00188         }
00189     }
00190 
00191   /*
00192     Les champs
00193   */
00194 
00195   (void) time(&t1);
00196   
00197    srand((int) t1); /* use time in seconds to set seed */  
00198 
00199    for(i=0;i<nnoe;i++)
00200      {
00201        DbleVectNode[mdim*i] =
00202          (med_float) (1+(int) (100.0*rand()/(RAND_MAX+1.0)));
00203 
00204        DbleVectNode[mdim*i+1] =
00205          (med_float) (1+(int) (100.0*rand()/(RAND_MAX+1.0)));
00206 
00207        /*
00208          printf("i %d DbleVectNode %lf %lf\n",i,DbleVectNode[mdim*i],
00209          DbleVectNode[mdim*i+1]);
00210        */
00211      }
00212 
00213    for(i=0;i<nquad4;i++)
00214      {
00215        DbleVectCell[mdim*i] =
00216          (med_float) (1+(int) (100.0*rand()/(RAND_MAX+1.0)));
00217 
00218        DbleVectCell[mdim*i+1] =
00219          (med_float) (1+(int) (1000*rand()/(RAND_MAX+1.0)));
00220 
00221        /*
00222          printf("i %d DbleVectCell %lf %lf\n",i,DbleVectCell[mdim*i],
00223          DbleVectCell[mdim*i+1]);
00224        */
00225      }
00226 
00227   /***************************************************************************/
00228 
00229   sprintf(buff,"%d",nnoe_dir);
00230   strcat(MedFile,buff);
00231   strcat(MedFile,".med");
00232 
00233   fid = MEDouvrir(MedFile,RDWR);
00234 
00235   if (fid < 0)
00236     ret = -1;
00237   else
00238     ret = 0;
00239   printf("%d\n",ret);
00240 
00241   /***************************************************************************/
00242   if (ret == 0)
00243     ret = MEDmaaCr(fid,maa,mdim);
00244   printf("%d\n",ret);
00245 
00246   if (ret == 0)
00247     ret = MEDunvCr(fid,maa);
00248   printf("%d\n",ret);
00249 
00250   /***************************************************************************/
00251 
00252   if (ret == 0)
00253     ret = MEDnoeudsEcr(fid,maa,mdim,coo,MED_FULL_INTERLACE,MED_CART,
00254                        nomcoo,unicoo,nomnoe,MED_FAUX,numnoe,MED_VRAI,
00255                        nufano,nnoe,WRONLY);
00256   printf("%d\n",ret);
00257 
00258   /*
00259     ecriture des mailles MED_QUAD4 :
00260     - connectivite
00261     - noms (optionnel) 
00262     - numeros (optionnel)
00263     - numeros des familles
00264   */
00265 
00266   if (ret == 0) 
00267     ret = MEDelementsEcr(fid,maa,mdim,quad4,MED_FULL_INTERLACE,
00268                          nomquad4,MED_FAUX,numquad4,MED_VRAI,nufaquad4,nquad4,
00269                          MED_MAILLE,MED_QUAD4,MED_NOD,WRONLY);
00270   printf("%d \n",ret);
00271 
00272   /***************************************************************************/
00273   /* ecriture des familles */
00274   /* Conventions :
00275      - toujours creer une famille de numero 0 ne comportant aucun attribut
00276        ni groupe (famille de reference pour les noeuds ou les elements
00277        qui ne sont rattaches a aucun groupe ni attribut)
00278      - les numeros de familles de noeuds sont > 0
00279      - les numeros de familles des elements sont < 0
00280      - rien d'imposer sur les noms de familles
00281    */ 
00282 
00283   /* la famille 0 */
00284   if (ret == 0)
00285     {
00286       strcpy(nomfam,"FAMILLE_0");
00287       numfam = 0;
00288       ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,0,
00289                      gro,0);
00290     }
00291   printf("%d \n",ret);
00292 
00293   /***************************************************************************/
00294   /*
00295     Les Champs
00296   */
00297 
00298   if (ret == 0)
00299     {
00300       ret = MEDchampCr(fid,champDbleVectNode,MED_REEL64,compDbleVectNode,
00301                        unitDbleVectNode,mdim);
00302 
00303       printf("MEDchampCr DbleVectNode : %d \n",ret);
00304 
00305       if (ret == 0)
00306         {
00307           ret = MEDchampEcr(fid, maa, champDbleVectNode,
00308                             (unsigned char *)DbleVectNode,
00309                             MED_NO_INTERLACE, nnoe,
00310                             MED_NOPG, MED_ALL, MED_NOPFL, WRONLY, MED_NOEUD, 
00311                             0, MED_NOPDT,"        ", 0., MED_NONOR);
00312         
00313           printf("MEDchampEcr DbleVectNode : %d \n",ret);
00314         }
00315     }
00316 
00317   if (ret == 0)
00318     {
00319       ret = MEDchampCr(fid,champDbleVectCell,MED_REEL64,compDbleVectCell,
00320                        unitDbleVectCell,mdim);
00321 
00322       printf("MEDchampCr DbleVectCell : %d \n",ret);
00323 
00324       if (ret == 0)
00325         {
00326           ret = MEDchampEcr(fid, maa, champDbleVectCell,
00327                             (unsigned char *)DbleVectCell,
00328                             MED_NO_INTERLACE, nquad4,
00329                             MED_NOPG, MED_ALL, MED_NOPFL, WRONLY, MED_MAILLE,
00330                             MED_QUAD4, MED_NOPDT,"        ", 0., MED_NONOR);
00331         
00332           printf("MEDchampEcr DbleVectCell : %d \n",ret);
00333         }
00334     }
00335 
00336   /***************************************************************************/
00337 
00338   ret = MEDfermer(fid);
00339   printf("%d\n",ret);
00340   
00341   free(coo);
00342   free(numnoe);
00343   free(nufano);
00344   free(nomnoe);
00345   free(quad4);
00346   free(numquad4);
00347   free(nufaquad4);
00348   free(nomquad4);
00349   free(DbleVectNode);
00350   free(DbleVectCell);
00351 
00352   return 0;
00353 }
00354