writefemavs.c

Go to the documentation of this file.
00001 /*
00002     This file is part of magpar.
00003 
00004     Copyright (C) 2002-2010 Werner Scholz
00005 
00006     www:   http://www.magpar.net/
00007     email: magpar(at)magpar.net
00008 
00009     magpar is free software; you can redistribute it and/or modify
00010     it under the terms of the GNU General Public License as published by
00011     the Free Software Foundation; either version 2 of the License, or
00012     (at your option) any later version.
00013 
00014     magpar is distributed in the hope that it will be useful,
00015     but WITHOUT ANY WARRANTY; without even the implied warranty of
00016     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017     GNU General Public License for more details.
00018 
00019     You should have received a copy of the GNU General Public License
00020     along with magpar; if not, write to the Free Software
00021     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00022 */
00023 
00024 static char const Id[] = "$Id: writefemavs.c 2962 2010-02-04 19:50:44Z scholz $\n\n";
00025 static char const Td[] = "$Today: " __FILE__ "  " __DATE__ "  "  __TIME__  " $\n\n";
00026 
00027 #include "magpario.h"
00028 #include "util/util.h"
00029 
00030 #ifdef ADDONS
00031 #define NVDATA  10
00032 #else
00033 #define NVDATA  4
00034 #endif
00035 #define NEDATA  11
00036 #define NEDATA2 0
00037 
00038 #define D_FLT 50
00039 #define D_EID 8
00040 
00044 int WriteFEMAVS(GridData *gdata)
00045 {
00046   MagparFunctionLogBegin;
00047 
00048   int rank,size;
00049   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
00050   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
00051 
00052   char fmesh[256];
00053 #if defined(ZLIB) && !defined(_WIN32) && !defined(__CYGWIN32__)
00054   ierr = PetscSNPrintf(fmesh,255,"%s.%04i.%s",gdata->simname,gdata->inp,"femsh");CHKERRQ(ierr);
00055 #else
00056   ierr = PetscSNPrintf(fmesh,255,"%s.%04i.%s",gdata->simname,gdata->inp,"femsh.inp");CHKERRQ(ierr);
00057 #endif
00058   FILE *fd;
00059   ierr = PetscFOpen(PETSC_COMM_WORLD,fmesh,"w",&fd);CHKERRQ(ierr);
00060   if (!rank && !fd) {
00061     SETERRQ1(PETSC_ERR_FILE_OPEN,"Cannot open %s\n",fmesh);
00062   }
00063   PetscPrintf(PETSC_COMM_WORLD,"Opening file %s\n",fmesh);
00064 
00065 #if defined(ZLIB) && !defined(_WIN32) && !defined(__CYGWIN32__)
00066   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"%i %i ??? ??? ???\n",
00067     gdata->n_vert,gdata->n_ele);CHKERRQ(ierr);
00068 #else
00069   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"%i %i %i %i %i\n",
00070     gdata->n_vert,gdata->n_ele,NVDATA,NEDATA,0);CHKERRQ(ierr);
00071 #endif
00072 
00073   for (int i=0; i<gdata->n_vert; i++) {
00074     ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,
00075       "%i %g %g %g\n",
00076       i+1,
00077       PetscRealPart(gdata->vertxyz[ND*i+0]),
00078       PetscRealPart(gdata->vertxyz[ND*i+1]),
00079       PetscRealPart(gdata->vertxyz[ND*i+2])
00080     );CHKERRQ(ierr);
00081   }
00082 
00083   char *wbufs,*wbufe;
00084   int nmax;
00085   /* add 1 so we allocate at least once char even if gdata->ln_ele==0 */
00086   nmax=gdata->ln_ele*(D_EID+6*D_FLT)+1;
00087   ierr = PetscMalloc(nmax*sizeof(char),&wbufs);CHKERRQ(ierr);
00088   wbufe=wbufs;
00089 
00090   for (int i=0; i<gdata->ln_ele; i++) {
00091     int nchars;
00092     /* write into buffer */
00093     nchars=
00094     snprintf(
00095       wbufe,
00096       nmax-(wbufe-wbufs),
00097       "%i %i tet %i %i %i %i\n",
00098       gdata->elel2g[i]+1,
00099       gdata->eleprop[i]+1,
00100       gdata->elevert[NV*i+0]+1,
00101       gdata->elevert[NV*i+1]+1,
00102       gdata->elevert[NV*i+2]+1,
00103       gdata->elevert[NV*i+3]+1
00104     );
00105     /* check for problems of snprintf */
00106     assert(nchars>0);
00107 
00108     /* update pointer to the end of the array */
00109     wbufe += nchars;
00110 
00111     /* check if we write beyond allocated area */
00112     assert(wbufe-wbufs < nmax);
00113   }
00114   SynchronizedFastFPrintf(fd,wbufe-wbufs,nmax,wbufs,PETSC_FALSE);
00115   wbufe=wbufs;
00116 
00117 #if defined(ZLIB) && !defined(_WIN32) && !defined(__CYGWIN32__)
00118   ierr = PetscFClose(PETSC_COMM_WORLD,fd);CHKERRQ(ierr);
00119 
00120 
00121   ierr = PetscSNPrintf(fmesh,255,"%s.%04i.%s",gdata->simname,gdata->inp,"fedat");CHKERRQ(ierr);
00122   ierr = PetscFOpen(PETSC_COMM_WORLD,fmesh,"w",&fd);CHKERRQ(ierr);
00123   if (!rank && !fd) {
00124     SETERRQ1(PETSC_ERR_FILE_OPEN,"Cannot open %s\n",fmesh);
00125   }
00126   PetscPrintf(PETSC_COMM_WORLD,"Opening file %s\n",fmesh);
00127 #endif
00128 
00129   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"%i",NVDATA);CHKERRQ(ierr);
00130   for (int i=0;i<NVDATA;i++) {
00131     ierr = PetscFPrintf(PETSC_COMM_WORLD,fd," 1");CHKERRQ(ierr);
00132   }
00133   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"\n");CHKERRQ(ierr);
00134 
00135   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"id, none\n");CHKERRQ(ierr);
00136   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"vert_vol, none\n");CHKERRQ(ierr);
00137   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"vert_pid, none\n");CHKERRQ(ierr);
00138   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"proc, none\n");CHKERRQ(ierr);
00139 #ifdef ADDONS
00140   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"H1x, none\n");CHKERRQ(ierr);
00141   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"H1y, none\n");CHKERRQ(ierr);
00142   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"H1z, none\n");CHKERRQ(ierr);
00143   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"H2x, none\n");CHKERRQ(ierr);
00144   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"H2y, none\n");CHKERRQ(ierr);
00145   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"H2z, none\n");CHKERRQ(ierr);
00146 #endif
00147 
00148   PetscReal *ta_vvol;
00149   VecGetArray(gdata->vertvol,&ta_vvol);
00150 
00151 #ifdef ADDONS
00152   PetscReal *ta_vh1;
00153   PetscReal *ta_vh2;
00154   if (gdata->VH1!=PETSC_NULL) {
00155     VecGetArray(gdata->VH1,&ta_vh1);
00156   }
00157   if (gdata->VH2!=PETSC_NULL) {
00158     VecGetArray(gdata->VH2,&ta_vh2);
00159   }
00160 #endif
00161 
00162   for (int i=0; i<gdata->ln_vert; i++) {
00163     int nchars;
00164     /* write into buffer */
00165     nchars=
00166     snprintf(
00167       wbufe,
00168       nmax-(wbufe-wbufs),
00169       "%i %i %g %i %i",
00170       gdata->vertl2g[i]+1,
00171       gdata->vertl2g[i]+1,
00172       ta_vvol[i],
00173       gdata->vertprop[i],
00174       rank
00175     );
00176 #ifdef ADDONS
00177     if (gdata->VH1!=PETSC_NULL) {
00178       nchars+=
00179       snprintf(
00180         wbufe+nchars,
00181         nmax-(wbufe+nchars-wbufs),
00182         " %g %g %g",
00183         ta_vh1[ND*i+0]*gdata->hscale/MU0,
00184         ta_vh1[ND*i+1]*gdata->hscale/MU0,
00185         ta_vh1[ND*i+2]*gdata->hscale/MU0
00186       );
00187     }
00188     else {
00189       nchars+=
00190       snprintf(
00191         wbufe+nchars,
00192         nmax-(wbufe+nchars-wbufs),
00193         " 0 0 0"
00194       );
00195     }
00196     if (gdata->VH2!=PETSC_NULL) {
00197       nchars+=
00198       snprintf(
00199         wbufe+nchars,
00200         nmax-(wbufe+nchars-wbufs),
00201         " %g %g %g",
00202         ta_vh2[ND*i+0]*gdata->hscale/MU0,
00203         ta_vh2[ND*i+1]*gdata->hscale/MU0,
00204         ta_vh2[ND*i+2]*gdata->hscale/MU0
00205       );
00206     }
00207     else {
00208       nchars+=
00209       snprintf(
00210         wbufe+nchars,
00211         nmax-(wbufe+nchars-wbufs),
00212         " 0 0 0"
00213       );
00214     }
00215     assert(NVDATA==10);
00216 #else
00217     assert(NVDATA==4);
00218 #endif
00219     nchars+=
00220     snprintf(
00221       wbufe+nchars,
00222       nmax-(wbufe+nchars-wbufs),
00223       "\n"
00224     );
00225 
00226     /* check for problems of snprintf */
00227     assert(nchars>0);
00228 
00229     /* update pointer to the end of the array */
00230     wbufe += nchars;
00231 
00232     /* check if we write beyond allocated area */
00233     assert(wbufe-wbufs < nmax);
00234   }
00235   VecRestoreArray(gdata->vertvol,&ta_vvol);
00236 
00237 #ifdef ADDONS
00238   if (gdata->VH1!=PETSC_NULL) {
00239     VecRestoreArray(gdata->VH1,&ta_vh1);
00240   }
00241   if (gdata->VH2!=PETSC_NULL) {
00242     VecRestoreArray(gdata->VH2,&ta_vh2);
00243   }
00244 #endif
00245 
00246   SynchronizedFastFPrintf(fd,wbufe-wbufs,nmax,wbufs,PETSC_FALSE);
00247   wbufe=wbufs;
00248 
00249 
00250   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"%i",NEDATA);CHKERRQ(ierr);
00251   for (int i=0;i<NEDATA;i++) {
00252     ierr = PetscFPrintf(PETSC_COMM_WORLD,fd," 1");CHKERRQ(ierr);
00253   }
00254   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"\n");CHKERRQ(ierr);
00255 
00256   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"id, none\n");CHKERRQ(ierr);
00257   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"proc, none\n");CHKERRQ(ierr);
00258   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"vol, none\n");CHKERRQ(ierr);
00259   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"prop, none\n");CHKERRQ(ierr);
00260   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"a_x, none\n");CHKERRQ(ierr);
00261   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"a_y, none\n");CHKERRQ(ierr);
00262   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"a_z, none\n");CHKERRQ(ierr);
00263   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"K1, none\n");CHKERRQ(ierr);
00264   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"K2, none\n");CHKERRQ(ierr);
00265   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"Js, none\n");CHKERRQ(ierr);
00266   ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"A, none\n");CHKERRQ(ierr);
00267 
00268   PetscReal *ta_vol;
00269   VecGetArray(gdata->elevol,&ta_vol);
00270 
00271   for (int i=0; i<gdata->ln_ele; i++) {
00272     int nchars;
00273     /* write into buffer */
00274     nchars=
00275     snprintf(
00276       wbufe,
00277       nmax-(wbufe-wbufs),
00278       "%i %i %i %g %i %g %g %g %g %g %g %g\n",
00279       gdata->elel2g[i]+1,
00280       gdata->elel2g[i]+1,
00281       rank,
00282       PetscRealPart(ta_vol[i]),
00283       gdata->eleprop[i]+1,
00284       sin(gdata->propdat[NP*gdata->eleprop[i]+0])*cos(gdata->propdat[NP*gdata->eleprop[i]+1]),
00285       sin(gdata->propdat[NP*gdata->eleprop[i]+0])*sin(gdata->propdat[NP*gdata->eleprop[i]+1]),
00286       cos(gdata->propdat[NP*gdata->eleprop[i]+0]),
00287       gdata->propdat[NP*gdata->eleprop[i]+2],
00288       gdata->propdat[NP*gdata->eleprop[i]+3],
00289       gdata->propdat[NP*gdata->eleprop[i]+4],
00290       gdata->propdat[NP*gdata->eleprop[i]+5]
00291     );
00292     /* check for problems of snprintf */
00293     assert(nchars>0);
00294 
00295     /* update pointer to the end of the array */
00296     wbufe += nchars;
00297 
00298     /* check if we write beyond allocated area */
00299     assert(wbufe-wbufs < nmax);
00300   }
00301   VecRestoreArray(gdata->elevol,&ta_vol);
00302 
00303   SynchronizedFastFPrintf(fd,wbufe-wbufs,nmax,wbufs,PETSC_FALSE);
00304   wbufe=wbufs;
00305 
00306   ierr = PetscFClose(PETSC_COMM_WORLD,fd);CHKERRQ(ierr);
00307 
00308   ierr = PetscFree(wbufs);CHKERRQ(ierr);
00309 
00310   MagparFunctionLogReturn(0);
00311 }
00312 

magpar - Parallel Finite Element Micromagnetics Package
Copyright (C) 2002-2010 Werner Scholz