0,0 → 1,241 |
PROGRAM difference |
|
c ************************************************************************** |
c * Get the difference between two runs * |
c * Michael Sprenger / Autumn 2006 * |
c ************************************************************************** |
|
implicit none |
|
c -------------------------------------------------------------------------- |
c Declaration of subroutine parameters |
c -------------------------------------------------------------------------- |
|
c Physical and numerical parameters |
real eps |
parameter (eps=0.01) |
integer nmax |
parameter (nmax=300*300*200) |
|
c Variables for input file 1 |
character*80 i1_filename |
real i1_varmin(4),i1_varmax(4),i1_stag(4) |
integer i1_vardim(4) |
real i1_mdv |
integer i1_ndim |
integer i1_nx,i1_ny,i1_nz |
real i1_time |
integer i1_nvars |
character*80 i1_vnam(100) |
real i1_field(nmax) |
|
c Variables for input file 2 |
character*80 i2_filename |
real i2_varmin(4),i2_varmax(4),i2_stag(4) |
integer i2_vardim(4) |
real i2_mdv |
integer i2_ndim |
integer i2_nx,i2_ny,i2_nz |
real i2_time |
integer i2_nvars |
character*80 i2_vnam(100) |
real i2_field(nmax) |
|
c Variables for output file |
character*80 o_filename |
real o_varmin(4),o_varmax(4),o_stag(4) |
integer o_vardim(4) |
real o_mdv |
integer o_ndim |
integer o_nx,o_ny,o_nz |
real o_time |
real o_field(nmax) |
|
c Auxiliary variables |
integer i,j,k |
integer cdfid,ierr |
integer isok |
character*80 cfn,varname |
|
c -------------------------------------------------------------------------------- |
c Input |
c -------------------------------------------------------------------------------- |
|
print*,'********************************************************' |
print*,'* DIFFERENCE *' |
print*,'********************************************************' |
|
c Read parameter file |
open(10,file='fort.10') |
read(10,*) i1_filename |
read(10,*) i2_filename |
read(10,*) o_filename |
close(10) |
print* |
print*,trim(i1_filename) |
print*,trim(i2_filename) |
print*,trim(o_filename) |
print* |
|
c Get a list of all variables on the two input files |
call cdfopn(i1_filename,cdfid,ierr) |
if (ierr.ne.0) goto 998 |
call getvars(cdfid,i1_nvars,i1_vnam,ierr) |
if (ierr.ne.0) goto 998 |
call getdef(cdfid,i1_vnam(i1_nvars),i1_ndim,i1_mdv,i1_vardim, |
> i1_varmin,i1_varmax,i1_stag,ierr) |
call clscdf(cdfid,ierr) |
print*,(trim(i1_vnam(i))//' ',i=1,i1_nvars) |
|
call cdfopn(i2_filename,cdfid,ierr) |
if (ierr.ne.0) goto 997 |
call getvars(cdfid,i2_nvars,i2_vnam,ierr) |
if (ierr.ne.0) goto 997 |
call clscdf(cdfid,ierr) |
print*,(trim(i2_vnam(i))//' ',i=1,i2_nvars) |
print* |
|
c Create the output file |
o_ndim=i1_ndim |
do i=1,i1_ndim |
o_varmin(i)=i1_varmin(i) |
o_varmax(i)=i1_varmax(i) |
enddo |
cfn=trim(o_filename)//'_cst' |
call crecdf(trim(o_filename),cdfid,o_varmin,o_varmax, |
> o_ndim,trim(cfn),ierr) |
if (ierr.ne.0) goto 996 |
call clscdf(cdfid,ierr) |
|
c -------------------------------------------------------------------------------- |
c Loop through all variables |
c -------------------------------------------------------------------------------- |
|
do i=1,i1_nvars |
|
c Check wether the variable is available on both files |
varname=i1_vnam(i) |
if (varname.eq.'time') goto 100 |
isok=0 |
call check_varok (isok,varname,i2_vnam,i2_nvars) |
if (isok.eq.0) goto 100 |
|
c Read first input file |
call cdfopn(i1_filename,cdfid,ierr) |
if (ierr.ne.0) goto 998 |
call getdef(cdfid,varname,i1_ndim,i1_mdv,i1_vardim, |
> i1_varmin,i1_varmax,i1_stag,ierr) |
if (ierr.ne.0) goto 998 |
call getdat(cdfid,varname,0.,0,i1_field,ierr) |
if (ierr.ne.0) goto 998 |
call clscdf(cdfid,ierr) |
|
c Read second input file |
call cdfopn(i2_filename,cdfid,ierr) |
if (ierr.ne.0) goto 998 |
call getdef(cdfid,varname,i2_ndim,i2_mdv,i2_vardim, |
> i2_varmin,i2_varmax,i2_stag,ierr) |
if (ierr.ne.0) goto 998 |
call getdat(cdfid,varname,0.,0,i2_field,ierr) |
if (ierr.ne.0) goto 998 |
call clscdf(cdfid,ierr) |
|
c Consistency check |
if (i1_ndim.ne.i2_ndim) then |
print*,'Inconsistent input files... Stop',i1_ndim,i2_ndim |
stop |
endif |
do j=1,3 |
if ( (i1_vardim(j).ne.i2_vardim(j)).or. |
> (abs(i1_varmin(j)-i2_varmin(j)).gt.eps).or. |
> (abs(i1_varmax(j)-i2_varmax(j)).gt.eps).or. |
> (abs(i1_stag(j)-i2_stag(j)).gt.eps)) then |
print*,'Inconsistent input files... Stop' |
print*,j,i1_varmin(j),i2_varmin(j) |
print*,j,i1_varmax(j),i2_varmax(j) |
print*,j,i1_vardim(j),i2_vardim(j) |
print*,j,i1_stag(j), i2_stag(j) |
stop |
endif |
enddo |
|
c Get the difference |
do j=1,i1_vardim(1)*i1_vardim(2)*i1_vardim(3) |
if ( (abs(i1_field(j)-i1_mdv).gt.eps).and. |
> (abs(i2_field(j)-i2_mdv).gt.eps) ) then |
o_field(j)=i1_field(j)-i2_field(j) |
else |
o_field(j)=i1_mdv |
endif |
enddo |
|
c Write to output file |
o_ndim=i1_ndim |
o_mdv =i1_mdv |
do j=1,i1_ndim |
o_vardim(j)=i1_vardim(j) |
o_varmin(j)=i1_varmin(j) |
o_varmax(j)=i1_varmax(j) |
o_stag(j) =i1_stag(j) |
enddo |
call cdfwopn(o_filename,cdfid,ierr) |
if (ierr.ne.0) goto 996 |
call putdef(cdfid,varname,o_ndim,o_mdv,o_vardim, |
> o_varmin,o_varmax,o_stag,ierr) |
if (ierr.ne.0) goto 996 |
call putdat(cdfid,varname,0.,0,o_field,ierr) |
if (ierr.ne.0) goto 996 |
print*,'W ',trim(varname),' ',trim(o_filename) |
call clscdf(cdfid,ierr) |
if (ierr.ne.0) goto 996 |
|
c Next |
100 continue |
|
enddo |
|
c ----------------------------------------------------------------- |
c Exception handling and format specs |
c ----------------------------------------------------------------- |
|
stop |
|
998 print*,'Problems with input file 1 ',trim(i1_filename) |
stop |
|
997 print*,'Problems with input file 2 ',trim(i2_filename) |
stop |
|
996 print*,'Problems with output file ',trim(o_filename) |
stop |
|
end |
|
|
c -------------------------------------------------------------------------------- |
c Check whether variable is found on netcdf file |
c -------------------------------------------------------------------------------- |
|
subroutine check_varok (isok,varname,varlist,nvars) |
|
c Check whether the variable <varname> is in the list <varlist(nvars)>. If this is |
C the case, <isok> is incremented by 1. Otherwise <isok> keeps its value. |
|
implicit none |
|
c Declaraion of subroutine parameters |
integer isok |
integer nvars |
character*80 varname |
character*80 varlist(nvars) |
|
c Auxiliary variables |
integer i |
|
c Main |
do i=1,nvars |
if (trim(varname).eq.trim(varlist(i))) isok=isok+1 |
enddo |
|
end |
|
Property changes: |
Added: svn:executable |