[Dart-dev] [4489] DART/trunk/models/NCOMMAS/model_mod.f90: Added support for the longer integer file identifiers created by

nancy at ucar.edu nancy at ucar.edu
Fri Sep 10 16:07:11 MDT 2010


Revision: 4489
Author:   thoar
Date:     2010-09-10 16:07:11 -0600 (Fri, 10 Sep 2010)
Log Message:
-----------
Added support for the longer integer file identifiers created by
the netCDF 4 interface. Added Ted's changes for the ability to
ensure some variables are strictly positive, even after assimilation.

Modified Paths:
--------------
    DART/trunk/models/NCOMMAS/model_mod.f90

-------------- next part --------------
Modified: DART/trunk/models/NCOMMAS/model_mod.f90
===================================================================
--- DART/trunk/models/NCOMMAS/model_mod.f90	2010-09-10 21:58:23 UTC (rev 4488)
+++ DART/trunk/models/NCOMMAS/model_mod.f90	2010-09-10 22:07:11 UTC (rev 4489)
@@ -158,6 +158,7 @@
    character(len=NF90_MAX_NAME) :: storder
    integer, dimension(NF90_MAX_VAR_DIMS) :: dimlens
    integer :: originalnumdims
+   integer :: posdef
    integer :: numdims
    integer :: varsize     ! prod(dimlens(1:numdims))
    integer :: index1      ! location in dart state vector of first occurrence
@@ -437,7 +438,6 @@
 integer :: ss, dd
 integer :: nDimensions, nVariables, nAttributes, unlimitedDimID, TimeDimID
 logical :: shapeok
-integer :: dimtime
 
 if ( module_initialized ) return ! only need to do this once.
 
@@ -551,6 +551,9 @@
    call nc_check( nf90_get_att(ncid, VarId, 'long_name' , progvar(ivar)%long_name), &
             'static_init_model', 'get_att long_name '//trim(string2))
 
+   call nc_check( nf90_get_att(ncid, VarId, 'posdef' , progvar(ivar)%posdef), &
+            'static_init_model', 'get_att posdef '//trim(string2))
+
    call nc_check( nf90_get_att(ncid, VarId, 'units' , progvar(ivar)%units), &
             'static_init_model', 'get_att units '//trim(string2))
 
@@ -563,7 +566,6 @@
    ! need to skip it. 
    varsize = 1
    dimlen  = 1
-   dimtime = 0
    progvar(ivar)%numdims = 0
    DimensionLoop : do i = 1,numdims
 
@@ -591,7 +593,7 @@
       if (trim(progvar(ivar)%storder) == 'xyz3d') shapeok = .true.
    endif
    if ( .not. shapeok ) then
-      write(string1,*)'unable to handle storage order of '//trim(progvar(ivar)%storder)//' numdims,timedim = ',progvar(ivar)%numdims,dimtime
+      write(string1,*)'unable to handle storage order of '//trim(progvar(ivar)%storder)//' numdims = ',progvar(ivar)%numdims
       call error_handler(E_ERR,'static_init_model', string1, source, revision, revdate, &
                                               text2=string2)
    endif
@@ -1262,7 +1264,7 @@
 ! which netcdf file is involved.
 !--------------------------------------------------------------------
 
-write(filename, '(a, i3)') 'ncFileID', ncFileID
+write(filename,*) 'ncFileID', ncFileID
 
 !-------------------------------------------------------------------------------
 ! make sure ncFileID refers to an open netCDF file, 
@@ -1306,15 +1308,15 @@
       mycount = 1
       DimCheck : do i = 1,progvar(ivar)%numdims
 
-         write(string1,'(''inquire dimension'',i2,A)') i,trim(string2)
+         write(string1,'(a,i2,A)') 'inquire dimension ',i,trim(string2)
          call nc_check(nf90_inquire_dimension(ncFileID, dimIDs(i), len=dimlen), &
-               'nc_write_model_vars', string1)
+               'nc_write_model_vars', trim(string1))
 
          if ( dimlen /= progvar(ivar)%dimlens(i) ) then
-            write(string1,*) trim(string2),'dim/dimlen',i,dimlen,'not',progvar(ivar)%dimlens(i)
+            write(string1,*) trim(string2),' dim/dimlen ',i,dimlen,' not ',progvar(ivar)%dimlens(i)
             write(string2,*)' but it should be.'
-            call error_handler(E_ERR, 'nc_write_model_vars', string1, &
-                            source, revision, revdate, text2=string2)
+            call error_handler(E_ERR, 'nc_write_model_vars', trim(string1), &
+                            source, revision, revdate, text2=trim(string2))
          endif
 
          mycount(i) = dimlen
@@ -1684,7 +1686,7 @@
             'restart_file_to_sv', string1)
 
       if ( dimlen /= progvar(ivar)%dimlens(i) ) then
-         write(string1,*) trim(myerrorstring),'dim/dimlen',i,dimlen,'not',progvar(ivar)%dimlens(i)
+         write(string1,*) trim(myerrorstring),' dim/dimlen ',i,dimlen,' not ',progvar(ivar)%dimlens(i)
          call error_handler(E_ERR,'restart_file_to_sv',string1,source,revision,revdate)
       endif
 
@@ -1923,6 +1925,10 @@
       nj = mycount(2)
       allocate(data_2d_array(ni, nj))
       call vector_to_prog_var(state_vector, progvar(ivar), data_2d_array)
+      
+      if ( progvar(ivar)%posdef == 1 ) then
+        where ( data_2d_array < 0 ) data_2d_array = 0
+      endif
 
       call nc_check(nf90_put_var(ncFileID, VarID, data_2d_array, &
         start=mystart(1:ncNdims), count=mycount(1:ncNdims)), &
@@ -1937,6 +1943,10 @@
       allocate(data_3d_array(ni, nj, nk))
       call vector_to_prog_var(state_vector, progvar(ivar), data_3d_array)
 
+      if ( progvar(ivar)%posdef == 1 ) then
+        where ( data_3d_array < 0 ) data_3d_array = 0
+      endif
+
       call nc_check(nf90_put_var(ncFileID, VarID, data_3d_array, &
         start=mystart(1:ncNdims), count=mycount(1:ncNdims)), &
             'sv_to_restart_file', 'put_var '//trim(varname))


More information about the Dart-dev mailing list