00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
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
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
00106 assert(nchars>0);
00107
00108
00109 wbufe += nchars;
00110
00111
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
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
00227 assert(nchars>0);
00228
00229
00230 wbufe += nchars;
00231
00232
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
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
00293 assert(nchars>0);
00294
00295
00296 wbufe += nchars;
00297
00298
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