out2_nc.f.html | ![]() |
Source file: out2_nc.f | |
Directory: /home/rjl/git/rjleveque/clawpack-4.x/clawpack/2d/lib | |
Converted: Sun May 15 2011 at 19:15:43 using clawcode2html | |
This documentation file will not reflect any later changes in the source file. |
c c c ========================================================= subroutine out2(maxmx,maxmy,meqn,mbc,mx,my,xlower,ylower, & dx,dy,q,t,iframe,aux,maux) c ========================================================= c c # Output the results for a general system of conservation laws c # in 2 dimensions c c # Write the results to the file fort.q c # Use format required by matlab script plotclaw2.m c # The same format is used by the amrclaw package. c # Here it's adapted to output just the single grid. c # set outaux = .true. to also output the aux arrays to fort.a c c c ----------------------------------------------------- c Routine to write netcdf files in the classic format ! #jj-2011.03.29 ! # Each file written by the fortran code has ! # Dimensions: ! # timedimension : UNLIMITED ! # meqn : The number of equations ! # dimx_: X dimension for grid number ! # dimy_: Y dimension for grid number ! # Variables: ! # timedimension : Stores the time of the frame ! # ngrids : Number of grids in this frame ! # naux : Number of Auxilary Variables ! # ndim : Number of Dimensions in the frame ! # grid_: A grid of (dimx,dimy,meqn) ! # Attributes: ! # (grid_) gridno : The number of this grid ! # level : The AMR level ! # dim_names : a list of dimensions [dimx,dimy] ! # dim.low : The lowest dimension value ! # dim.d : The distance between grid points c ----------------------------------------------------- c implicit double precision (a-h,o-z) include 'netcdf.inc' dimension q(1-mbc:maxmx+mbc, 1-mbc:maxmy+mbc, meqn) dimension aux(1-mbc:maxmx+mbc, 1-mbc:maxmy+mbc, maux) character*10 fname1, fname2, fname3 logical outaux,do_ascii real(kind=8) time integer ncid,rcode integer timeid,tVarID,meqnID,ngridsVarID,nauxVarID,ndimVarID integer dimxid,dimyid,xlowid,ylowid,dxid,dyid integer gridid integer ntimes character*2 gridstr character*40 dim_names REAL(kind=8), ALLOCATABLE ::grid(:,:,:) integer nx, ny real xlow,ylow nx=mx ny=my outaux = .false. do_ascii = .false. c c # first create the file name and open file c fname1 = 'fort.qxxxx' fname2 = 'fort.txxxx' fname3 = 'fort.axxxx' nstp = iframe do 55 ipos = 10, 7, -1 idigit = mod(nstp,10) fname1(ipos:ipos) = char(ichar('0') + idigit) fname2(ipos:ipos) = char(ichar('0') + idigit) fname3(ipos:ipos) = char(ichar('0') + idigit) nstp = nstp / 10 55 continue if (do_ascii) then open(unit=50,file=fname1,status='unknown',form='formatted') if (do_ascii) then open(unit=60,file=fname2,status='unknown',form='formatted') c c # the following parameters are used in amrclaw where there are c # multiple grids. Here they are all set to 1: ngrids = 1 mptr = 1 level = 1 ntimes=1 c write(50,1001) mptr,level,mx,my c write(50,1002) xlower,ylower,dx,dy !!!!Define netcdf file rcode=NF_CREATE(fname1//'.nc',NF_NOCLOBBER,ncid) if(rcode.ne.NF_NOERR) print *,'ERROR OPENING NETCDF FILE' rcode=NF_DEF_DIM(ncid,'timedimension',NF_UNLIMITED,timeid) rcode=NF_DEF_VAR(ncid,'timedimension',NF_DOUBLE,1,timeid, & tVarID) rcode=NF_DEF_DIM(ncid,'meqn',meqn,meqnid) rcode=NF_DEF_VAR(ncid,'ngrids',NF_INT,0,0,ngridsVarID) rcode=NF_DEF_VAR(ncid,'naux',NF_INT,0,0,nauxVarID) rcode=NF_DEF_VAR(ncid,'ndim',NF_INT,0,0,ndimVarID) write(gridstr,67) mptr 67 format(I2.2) rcode=NF_DEF_DIM(ncid,'dimx_'//trim(gridstr),nx,dimxid) if(rcode.ne.NF_NOERR) print *,'ERROR DEFINE DIMS' rcode=NF_DEF_DIM(ncid,'dimy_'//trim(gridstr),ny,dimyid) if(rcode.ne.NF_NOERR) print *,'ERROR DEFINE DIMS' rcode=NF_DEF_Var(ncid,'grid_'//trim(gridstr),NF_DOUBLE,4, & (/dimxid,dimyid,meqnid,timeid/),gridid) if(rcode.ne.NF_NOERR) print *,'ERROR DEFINE VAR' rcode=NF_PUT_ATT_INT(ncid,gridid,'gridno',NF_INT,1, & mptr) rcode=NF_PUT_ATT_INT(ncid,gridid,'level',NF_INT,1,level) dim_names="['dimx','dimy']" rcode=NF_PUT_ATT_TEXT(ncid,gridid,'dim_names', & LEN_TRIM(dim_names),TRIM(dim_names)) rcode=NF_PUT_ATT_DOUBLE(ncid,gridid,'dimx.lower',NF_FLOAT, & 1,xlower) rcode=NF_PUT_ATT_DOUBLE(ncid,gridid,'dimy.lower',NF_FLOAT, & 1,ylower) rcode=NF_PUT_ATT_DOUBLE(ncid,gridid,'dimx.d',NF_FLOAT,1, & dx) rcode=NF_PUT_ATT_DOUBLE(ncid,gridid,'dimy.d',NF_FLOAT,1, & dy) rcode=NF_ENDDEF(ncid) write(0,*) "xlower, ylower:",xlower,ylower,sizeof(xlower) allocate(grid(nx,ny,meqn)) time=t c do j=1,my do i=1,mx do m=1,meqn c # exponents with more than 2 digits cause problems reading c # into matlab... reset tiny values to zero: if (dabs(q(i,j,m)) .lt. 1d-99) q(i,j,m) = 0.d0 grid(i,j,m)=q(i,j,m) enddo if (do_ascii) then write(50,1005) (grid(i,j,m), m=1,meqn) enddo if (do_ascii) then write(50,*) ' ' enddo if (do_ascii) then write(50,*) ' ' rcode=NF_PUT_VARA_DOUBLE(ncid,gridid,(/1,1,1,1/), & (/nx,ny,meqn,1/),grid) deallocate(grid) rcode=NF_PUT_VAR_DOUBLE(ncid,tVarID,t) if(rcode.ne.NF_NOERR) print *,'ERROR Write Time' rcode=NF_PUT_VAR_INT(ncid,ngridsVarID,int(ngrids)) if(rcode.ne.NF_NOERR) print *,'ERROR Write GridNo' rcode=NF_PUT_VAR_INT(ncid,nauxVarID,maux) rcode=NF_PUT_VAR_INT(ncid,ndimVarID,2) rcode=NF_CLOSE(ncid) 1001 format(i5,' grid_number',/, & i5,' AMR_level',/, & i5,' mx',/, & i5,' my') 1002 format(e26.16,' xlow', /, & e26.16,' ylow', /, & e26.16,' dx', /, & e26.16,' dy',/) 1005 format(4e26.16) if (outaux) then c # also output the aux arrays: open(unit=70,file=fname3,status='unknown',form='formatted') write(70,1001) mptr,level,mx,my write(70,1002) xlower,ylower,dx,dy do 120 j=1,my do 110 i=1,mx do m=1,maux c # exponents with more than 2 digits cause problems reading c # into matlab... reset tiny values to zero: if (dabs(aux(i,j,m)) .lt. 1d-99) aux(i,j,m) = 0.d0 enddo c write(70,1005) (aux(i,j,m), m=1,maux) c 110 continue write(70,*) ' ' 120 continue write(70,*) ' ' close(unit=70) endif if (do_ascii) then write(60,1000) t,meqn,ngrids,maux,2 1000 format(e26.16,' time', /, & i5,' meqn'/, & i5,' ngrids'/, & i5,' maux'/, & i5,' ndim'/,/) !c if (do_ascii) then close(unit=50) if (do_ascii) then close(unit=60) return end