New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 10025 for utils/tools/NESTING/src/agrif_readwrite.f90 – NEMO

Ignore:
Timestamp:
2018-08-02T15:25:27+02:00 (6 years ago)
Author:
clem
Message:

nesting tools are partly rewritten (mostly for create_coordinates and bathy) to get better functionality. Now you can use the nesting to either define an agrif zoom or a regional domain (for bdy purposes). Also, the nesting tools output a domain_cfg.nc that can be directly used in NEMO4 without the need of DOMAINcfg tool. The option of median average for bathymetry interpolation still does not work properly but it's not new

File:
1 edited

Legend:

Unmodified
Added
Removed
  • utils/tools/NESTING/src/agrif_readwrite.f90

    r9628 r10025  
    4040    TYPE(Coordinates) :: Grid 
    4141    !       
    42     CALL Read_Ncdf_var('glamt',name,Grid%glamt) 
    43     CALL Read_Ncdf_var('glamu',name,Grid%glamu) 
    44     CALL Read_Ncdf_var('glamv',name,Grid%glamv) 
    45     CALL Read_Ncdf_var('glamf',name,Grid%glamf) 
    46     CALL Read_Ncdf_var('gphit',name,Grid%gphit) 
    47     CALL Read_Ncdf_var('gphiu',name,Grid%gphiu) 
    48     CALL Read_Ncdf_var('gphiv',name,Grid%gphiv) 
    49     CALL Read_Ncdf_var('gphif',name,Grid%gphif) 
    50     CALL Read_Ncdf_var('e1t',name,Grid%e1t) 
    51     CALL Read_Ncdf_var('e1u',name,Grid%e1u) 
    52     CALL Read_Ncdf_var('e1v',name,Grid%e1v) 
    53     CALL Read_Ncdf_var('e1f',name,Grid%e1f) 
    54     CALL Read_Ncdf_var('e2t',name,Grid%e2t) 
    55     CALL Read_Ncdf_var('e2u',name,Grid%e2u) 
    56     CALL Read_Ncdf_var('e2v',name,Grid%e2v) 
    57     CALL Read_Ncdf_var('e2f',name,Grid%e2f) 
    58     CALL Read_Ncdf_var('nav_lon',name,Grid%nav_lon) 
    59     CALL Read_Ncdf_var('nav_lat',name,Grid%nav_lat)        
     42    CALL read_ncdf_var('glamt',name,Grid%glamt) 
     43    CALL read_ncdf_var('glamu',name,Grid%glamu) 
     44    CALL read_ncdf_var('glamv',name,Grid%glamv) 
     45    CALL read_ncdf_var('glamf',name,Grid%glamf) 
     46    CALL read_ncdf_var('gphit',name,Grid%gphit) 
     47    CALL read_ncdf_var('gphiu',name,Grid%gphiu) 
     48    CALL read_ncdf_var('gphiv',name,Grid%gphiv) 
     49    CALL read_ncdf_var('gphif',name,Grid%gphif) 
     50    CALL read_ncdf_var('e1t',name,Grid%e1t) 
     51    CALL read_ncdf_var('e1u',name,Grid%e1u) 
     52    CALL read_ncdf_var('e1v',name,Grid%e1v) 
     53    CALL read_ncdf_var('e1f',name,Grid%e1f) 
     54    CALL read_ncdf_var('e2t',name,Grid%e2t) 
     55    CALL read_ncdf_var('e2u',name,Grid%e2u) 
     56    CALL read_ncdf_var('e2v',name,Grid%e2v) 
     57    CALL read_ncdf_var('e2f',name,Grid%e2f) 
     58    CALL read_ncdf_var('nav_lon',name,Grid%nav_lon) 
     59    CALL read_ncdf_var('nav_lat',name,Grid%nav_lat)        
    6060    !  
    6161    IF( PRESENT(Pacifique) )THEN 
     
    103103    TYPE(Coordinates) :: Grid 
    104104    !       
    105     CALL Read_Ncdf_var('glamt',name,Grid%glamt,strt,cnt) 
    106     CALL Read_Ncdf_var('glamu',name,Grid%glamu,strt,cnt) 
    107     CALL Read_Ncdf_var('glamv',name,Grid%glamv,strt,cnt) 
    108     CALL Read_Ncdf_var('glamf',name,Grid%glamf,strt,cnt) 
    109     CALL Read_Ncdf_var('gphit',name,Grid%gphit,strt,cnt) 
    110     CALL Read_Ncdf_var('gphiu',name,Grid%gphiu,strt,cnt) 
    111     CALL Read_Ncdf_var('gphiv',name,Grid%gphiv,strt,cnt) 
    112     CALL Read_Ncdf_var('gphif',name,Grid%gphif,strt,cnt) 
    113     CALL Read_Ncdf_var('e1t',name,Grid%e1t,strt,cnt) 
    114     CALL Read_Ncdf_var('e1u',name,Grid%e1u,strt,cnt) 
    115     CALL Read_Ncdf_var('e1v',name,Grid%e1v,strt,cnt) 
    116     CALL Read_Ncdf_var('e1f',name,Grid%e1f,strt,cnt) 
    117     CALL Read_Ncdf_var('e2t',name,Grid%e2t,strt,cnt) 
    118     CALL Read_Ncdf_var('e2u',name,Grid%e2u,strt,cnt) 
    119     CALL Read_Ncdf_var('e2v',name,Grid%e2v,strt,cnt) 
    120     CALL Read_Ncdf_var('e2f',name,Grid%e2f,strt,cnt) 
    121     CALL Read_Ncdf_var('nav_lon',name,Grid%nav_lon,strt,cnt) 
    122     CALL Read_Ncdf_var('nav_lat',name,Grid%nav_lat,strt,cnt)        
     105    CALL read_ncdf_var('glamt',name,Grid%glamt,strt,cnt) 
     106    CALL read_ncdf_var('glamu',name,Grid%glamu,strt,cnt) 
     107    CALL read_ncdf_var('glamv',name,Grid%glamv,strt,cnt) 
     108    CALL read_ncdf_var('glamf',name,Grid%glamf,strt,cnt) 
     109    CALL read_ncdf_var('gphit',name,Grid%gphit,strt,cnt) 
     110    CALL read_ncdf_var('gphiu',name,Grid%gphiu,strt,cnt) 
     111    CALL read_ncdf_var('gphiv',name,Grid%gphiv,strt,cnt) 
     112    CALL read_ncdf_var('gphif',name,Grid%gphif,strt,cnt) 
     113    CALL read_ncdf_var('e1t',name,Grid%e1t,strt,cnt) 
     114    CALL read_ncdf_var('e1u',name,Grid%e1u,strt,cnt) 
     115    CALL read_ncdf_var('e1v',name,Grid%e1v,strt,cnt) 
     116    CALL read_ncdf_var('e1f',name,Grid%e1f,strt,cnt) 
     117    CALL read_ncdf_var('e2t',name,Grid%e2t,strt,cnt) 
     118    CALL read_ncdf_var('e2u',name,Grid%e2u,strt,cnt) 
     119    CALL read_ncdf_var('e2v',name,Grid%e2v,strt,cnt) 
     120    CALL read_ncdf_var('e2f',name,Grid%e2f,strt,cnt) 
     121    CALL read_ncdf_var('nav_lon',name,Grid%nav_lon,strt,cnt) 
     122    CALL read_ncdf_var('nav_lat',name,Grid%nav_lat,strt,cnt)        
    123123    ! 
    124124    WRITE(*,*) ' ' 
     
    146146    !            
    147147    dimnames = (/ 'x','y' /) 
    148     CALL Write_Ncdf_dim(dimnames(1),name,nxfin) 
    149     CALL Write_Ncdf_dim(dimnames(2),name,nyfin) 
    150     !       
    151     CALL Write_Ncdf_var('nav_lon',dimnames,name,Grid%nav_lon,'float')       
    152     CALL Write_Ncdf_var('nav_lat',dimnames,name,Grid%nav_lat,'float') 
    153     ! 
    154     CALL Write_Ncdf_var('glamt',dimnames,name,Grid%glamt,'double') 
    155     CALL Write_Ncdf_var('glamu',dimnames,name,Grid%glamu,'double') 
    156     CALL Write_Ncdf_var('glamv',dimnames,name,Grid%glamv,'double') 
    157     CALL Write_Ncdf_var('glamf',dimnames,name,Grid%glamf,'double') 
    158     CALL Write_Ncdf_var('gphit',dimnames,name,Grid%gphit,'double') 
    159     CALL Write_Ncdf_var('gphiu',dimnames,name,Grid%gphiu,'double') 
    160     CALL Write_Ncdf_var('gphiv',dimnames,name,Grid%gphiv,'double') 
    161     CALL Write_Ncdf_var('gphif',dimnames,name,Grid%gphif,'double')       
    162     CALL Write_Ncdf_var('e1t',dimnames,name,Grid%e1t,'double')       
    163     CALL Write_Ncdf_var('e1u',dimnames,name,Grid%e1u,'double')      
    164     CALL Write_Ncdf_var('e1v',dimnames,name,Grid%e1v,'double')       
    165     CALL Write_Ncdf_var('e1f',dimnames,name,Grid%e1f,'double') 
    166     CALL Write_Ncdf_var('e2t',dimnames,name,Grid%e2t,'double') 
    167     CALL Write_Ncdf_var('e2u',dimnames,name,Grid%e2u,'double') 
    168     CALL Write_Ncdf_var('e2v',dimnames,name,Grid%e2v,'double') 
    169     CALL Write_Ncdf_var('e2f',dimnames,name,Grid%e2f,'double') 
    170     !       
    171     CALL Copy_Ncdf_att('nav_lon',TRIM(parent_coordinate_file),name,MINVAL(Grid%nav_lon),MAXVAL(Grid%nav_lon)) 
    172     CALL Copy_Ncdf_att('nav_lat',TRIM(parent_coordinate_file),name,MINVAL(Grid%nav_lat),MAXVAL(Grid%nav_lat)) 
    173     CALL Copy_Ncdf_att('glamt',TRIM(parent_coordinate_file),name) 
    174     CALL Copy_Ncdf_att('glamu',TRIM(parent_coordinate_file),name) 
    175     CALL Copy_Ncdf_att('glamv',TRIM(parent_coordinate_file),name) 
    176     CALL Copy_Ncdf_att('glamf',TRIM(parent_coordinate_file),name) 
    177     CALL Copy_Ncdf_att('gphit',TRIM(parent_coordinate_file),name) 
    178     CALL Copy_Ncdf_att('gphiu',TRIM(parent_coordinate_file),name) 
    179     CALL Copy_Ncdf_att('gphiv',TRIM(parent_coordinate_file),name) 
    180     CALL Copy_Ncdf_att('gphif',TRIM(parent_coordinate_file),name) 
    181     CALL Copy_Ncdf_att('e1t',TRIM(parent_coordinate_file),name) 
    182     CALL Copy_Ncdf_att('e1u',TRIM(parent_coordinate_file),name) 
    183     CALL Copy_Ncdf_att('e1v',TRIM(parent_coordinate_file),name) 
    184     CALL Copy_Ncdf_att('e1f',TRIM(parent_coordinate_file),name) 
    185     CALL Copy_Ncdf_att('e2t',TRIM(parent_coordinate_file),name) 
    186     CALL Copy_Ncdf_att('e2u',TRIM(parent_coordinate_file),name) 
    187     CALL Copy_Ncdf_att('e2v',TRIM(parent_coordinate_file),name) 
    188     CALL Copy_Ncdf_att('e2f',TRIM(parent_coordinate_file),name)             
     148    CALL write_ncdf_dim(dimnames(1),name,nxfin) 
     149    CALL write_ncdf_dim(dimnames(2),name,nyfin) 
     150    !       
     151    CALL write_ncdf_var('nav_lon',dimnames,name,Grid%nav_lon,'float')       
     152    CALL write_ncdf_var('nav_lat',dimnames,name,Grid%nav_lat,'float') 
     153    ! 
     154    CALL write_ncdf_var('glamt',dimnames,name,Grid%glamt,'double') 
     155    CALL write_ncdf_var('glamu',dimnames,name,Grid%glamu,'double') 
     156    CALL write_ncdf_var('glamv',dimnames,name,Grid%glamv,'double') 
     157    CALL write_ncdf_var('glamf',dimnames,name,Grid%glamf,'double') 
     158    CALL write_ncdf_var('gphit',dimnames,name,Grid%gphit,'double') 
     159    CALL write_ncdf_var('gphiu',dimnames,name,Grid%gphiu,'double') 
     160    CALL write_ncdf_var('gphiv',dimnames,name,Grid%gphiv,'double') 
     161    CALL write_ncdf_var('gphif',dimnames,name,Grid%gphif,'double')       
     162    CALL write_ncdf_var('e1t',dimnames,name,Grid%e1t,'double')       
     163    CALL write_ncdf_var('e1u',dimnames,name,Grid%e1u,'double')      
     164    CALL write_ncdf_var('e1v',dimnames,name,Grid%e1v,'double')       
     165    CALL write_ncdf_var('e1f',dimnames,name,Grid%e1f,'double') 
     166    CALL write_ncdf_var('e2t',dimnames,name,Grid%e2t,'double') 
     167    CALL write_ncdf_var('e2u',dimnames,name,Grid%e2u,'double') 
     168    CALL write_ncdf_var('e2v',dimnames,name,Grid%e2v,'double') 
     169    CALL write_ncdf_var('e2f',dimnames,name,Grid%e2f,'double') 
     170    !       
     171    CALL copy_ncdf_att('nav_lon',TRIM(parent_coordinate_file),name,MINVAL(Grid%nav_lon),MAXVAL(Grid%nav_lon)) 
     172    CALL copy_ncdf_att('nav_lat',TRIM(parent_coordinate_file),name,MINVAL(Grid%nav_lat),MAXVAL(Grid%nav_lat)) 
     173    CALL copy_ncdf_att('glamt',TRIM(parent_coordinate_file),name) 
     174    CALL copy_ncdf_att('glamu',TRIM(parent_coordinate_file),name) 
     175    CALL copy_ncdf_att('glamv',TRIM(parent_coordinate_file),name) 
     176    CALL copy_ncdf_att('glamf',TRIM(parent_coordinate_file),name) 
     177    CALL copy_ncdf_att('gphit',TRIM(parent_coordinate_file),name) 
     178    CALL copy_ncdf_att('gphiu',TRIM(parent_coordinate_file),name) 
     179    CALL copy_ncdf_att('gphiv',TRIM(parent_coordinate_file),name) 
     180    CALL copy_ncdf_att('gphif',TRIM(parent_coordinate_file),name) 
     181    CALL copy_ncdf_att('e1t',TRIM(parent_coordinate_file),name) 
     182    CALL copy_ncdf_att('e1u',TRIM(parent_coordinate_file),name) 
     183    CALL copy_ncdf_att('e1v',TRIM(parent_coordinate_file),name) 
     184    CALL copy_ncdf_att('e1f',TRIM(parent_coordinate_file),name) 
     185    CALL copy_ncdf_att('e2t',TRIM(parent_coordinate_file),name) 
     186    CALL copy_ncdf_att('e2u',TRIM(parent_coordinate_file),name) 
     187    CALL copy_ncdf_att('e2v',TRIM(parent_coordinate_file),name) 
     188    CALL copy_ncdf_att('e2f',TRIM(parent_coordinate_file),name)             
    189189    ! 
    190190    WRITE(*,*) ' ' 
     
    209209    TYPE(Coordinates) :: Grid 
    210210    ! 
    211     CALL Read_Ncdf_var('mbathy',name,Grid%Bathy_level)     
     211    CALL read_ncdf_var('mbathy',name,Grid%Bathy_level)     
    212212    ! 
    213213    WRITE(*,*) ' ' 
     
    232232    CHARACTER(len=1),DIMENSION(2) :: dimnames 
    233233    ! 
    234     status = nf90_create(name,NF90_NOCLOBBER,ncid) 
     234    status = nf90_create(name,NF90_WRITE,ncid) 
    235235    status = nf90_close(ncid)           
    236236    ! 
    237237    dimnames = (/ 'x','y' /) 
    238     CALL Write_Ncdf_dim(dimnames(1),name,nxfin) 
    239     CALL Write_Ncdf_dim(dimnames(2),name,nyfin) 
    240     !       
    241     CALL Write_Ncdf_var('nav_lon',dimnames,name,Grid%nav_lon    ,'float') 
    242     CALL Write_Ncdf_var('nav_lat',dimnames,name,Grid%nav_lat    ,'float') 
    243     CALL Write_Ncdf_var('mbathy' ,dimnames,name,Grid%bathy_level,'float') 
    244     ! 
    245     CALL Copy_Ncdf_att('nav_lon',TRIM(parent_meshmask_file),name,MINVAL(Grid%nav_lon),MAXVAL(Grid%nav_lon)) 
    246     CALL Copy_Ncdf_att('nav_lat',TRIM(parent_meshmask_file),name,MINVAL(Grid%nav_lat),MAXVAL(Grid%nav_lat)) 
    247     CALL Copy_Ncdf_att('mbathy' ,TRIM(parent_meshmask_file),name)        
     238    CALL write_ncdf_dim(dimnames(1),name,nxfin) 
     239    CALL write_ncdf_dim(dimnames(2),name,nyfin) 
     240    !       
     241    CALL write_ncdf_var('nav_lon',dimnames,name,Grid%nav_lon    ,'float') 
     242    CALL write_ncdf_var('nav_lat',dimnames,name,Grid%nav_lat    ,'float') 
     243    CALL write_ncdf_var('mbathy' ,dimnames,name,Grid%bathy_level,'float') 
     244    ! 
     245    CALL copy_ncdf_att('nav_lon',TRIM(parent_meshmask_file),name,MINVAL(Grid%nav_lon),MAXVAL(Grid%nav_lon)) 
     246    CALL copy_ncdf_att('nav_lat',TRIM(parent_meshmask_file),name,MINVAL(Grid%nav_lat),MAXVAL(Grid%nav_lat)) 
     247    CALL copy_ncdf_att('mbathy' ,TRIM(parent_meshmask_file),name)        
    248248    ! 
    249249    WRITE(*,*) ' ' 
     
    276276       WRITE(*,*) ' etopo format for external high resolution database  ' 
    277277       WRITE(*,*) '****' 
    278        CALL Read_Ncdf_var('lon',name,topo_lon) 
    279        CALL Read_Ncdf_var('lat',name,topo_lat) 
     278       CALL read_ncdf_var('lon',name,topo_lon) 
     279       CALL read_ncdf_var('lat',name,topo_lat) 
    280280    ELSE IF( Dims_Existence('x',name) .AND. Dims_Existence('y',name) ) THEN 
    281281       WRITE(*,*) '****' 
    282282       WRITE(*,*) ' OPA format for external high resolution database  ' 
    283283       WRITE(*,*) '****' 
    284        CALL Read_Ncdf_var('nav_lon',name,CoarseGrid%nav_lon) 
    285        CALL Read_Ncdf_var('nav_lat',name,CoarseGrid%nav_lat) 
    286        CALL Read_Ncdf_var(parent_batmet_name,name,CoarseGrid%Bathy_meter) 
     284       CALL read_ncdf_var('nav_lon',name,CoarseGrid%nav_lon) 
     285       CALL read_ncdf_var('nav_lat',name,CoarseGrid%nav_lat) 
     286       CALL read_ncdf_var(parent_batmet_name,name,CoarseGrid%Bathy_meter) 
    287287       !             
    288288       IF ( PRESENT(Pacifique) ) THEN 
     
    303303    ENDIF 
    304304    ! 
    305     IF( MAXVAL(ChildGrid%glamt) > 180 ) THEN                  
     305    IF( MAXVAL(ChildGrid%glamt) > 180. ) THEN                  
    306306       !           
    307        WHERE( topo_lon < 0 ) 
    308           topo_lon = topo_lon + 360. 
    309        END WHERE 
     307       WHERE( topo_lon < 0. )   topo_lon = topo_lon + 360. 
    310308       !           
    311309       i_min = MAXLOC(topo_lon,mask = topo_lon < MINVAL(ChildGrid%nav_lon)-zdel) 
     
    316314       tabdim1 = ( SIZE(topo_lon) - i_min(1) + 1 ) + i_max(1)                     
    317315       !           
    318        IF(j_min(1)-2 >= 1 .AND. j_max(1)+3 <= SIZE(topo_lat,1) ) THEN 
    319           j_min(1) = j_min(1)-2 
    320           j_max(1) = j_max(1)+3 
     316       IF( ln_agrif_domain ) THEN 
     317          IF(j_min(1)-2 >= 1 .AND. j_max(1)+3 <= SIZE(topo_lat,1) ) THEN 
     318             j_min(1) = j_min(1)-2 
     319             j_max(1) = j_max(1)+3 
     320          ENDIF 
    321321       ENDIF 
    322322       tabdim2 = j_max(1) - j_min(1) + 1 
     
    352352    ELSE 
    353353       ! 
     354       WHERE( topo_lon > 180. )   topo_lon = topo_lon - 360. 
     355       ! 
    354356       i_min = MAXLOC(topo_lon,mask = topo_lon < MINVAL(ChildGrid%nav_lon)-zdel) 
    355357       i_max = MINLOC(topo_lon,mask = topo_lon > MAXVAL(ChildGrid%nav_lon)+zdel) 
     
    357359       j_max = MINLOC(topo_lat,mask = topo_lat > MAXVAL(ChildGrid%nav_lat)+zdel) 
    358360       !       
    359        IF(i_min(1)-2 >= 1 .AND. i_max(1)+3 <= SIZE(topo_lon,1) ) THEN 
    360           i_min(1) = i_min(1)-2 
    361           i_max(1) = i_max(1)+3 
     361       IF( ln_agrif_domain ) THEN 
     362          IF(i_min(1)-2 >= 1 .AND. i_max(1)+3 <= SIZE(topo_lon,1) ) THEN 
     363             i_min(1) = i_min(1)-2 
     364             i_max(1) = i_max(1)+3 
     365          ENDIF 
    362366       ENDIF 
    363367       tabdim1 = i_max(1) - i_min(1) + 1 
    364368       ! 
    365        IF(j_min(1)-2 >= 1 .AND. j_max(1)+3 <= SIZE(topo_lat,1) ) THEN 
    366           j_min(1) = j_min(1)-2 
    367           j_max(1) = j_max(1)+3 
     369       IF( ln_agrif_domain ) THEN 
     370          IF(j_min(1)-2 >= 1 .AND. j_max(1)+3 <= SIZE(topo_lat,1) ) THEN 
     371             j_min(1) = j_min(1)-2 
     372             j_max(1) = j_max(1)+3 
     373          ENDIF 
    368374       ENDIF 
    369375       tabdim2 = j_max(1) - j_min(1) + 1 
     
    423429    TYPE(Coordinates) :: Grid 
    424430    ! 
    425     CALL Read_Ncdf_var(parent_batmet_name,name,Grid%Bathy_meter)     
     431    CALL read_ncdf_var(parent_batmet_name,name,Grid%Bathy_meter)     
    426432    ! 
    427433    WRITE(*,*) ' ' 
     
    454460    dimnames = (/ 'x','y' /) 
    455461 
    456     CALL Write_Ncdf_dim(dimnames(1),name,nx) 
    457     CALL Write_Ncdf_dim(dimnames(2),name,ny) 
     462    CALL write_ncdf_dim(dimnames(1),name,nx) 
     463    CALL write_ncdf_dim(dimnames(2),name,ny) 
    458464    !      
    459     CALL Write_Ncdf_var('nav_lon'         ,dimnames,name,Grid%nav_lon    ,'float') 
    460     CALL Write_Ncdf_var('nav_lat'         ,dimnames,name,Grid%nav_lat    ,'float') 
    461     CALL Write_Ncdf_var(parent_batmet_name,dimnames,name,Grid%bathy_meter,'float') 
    462     CALL Write_Ncdf_var('weight'          ,dimnames,name,Grid%wgt        ,'float') 
    463     ! 
    464     CALL Copy_Ncdf_att('nav_lon'         ,TRIM(parent_bathy_meter),name,MINVAL(Grid%nav_lon),MAXVAL(Grid%nav_lon)) 
    465     CALL Copy_Ncdf_att('nav_lat'         ,TRIM(parent_bathy_meter),name,MINVAL(Grid%nav_lat),MAXVAL(Grid%nav_lat))   
    466     CALL Copy_Ncdf_att(parent_batmet_name,TRIM(parent_bathy_meter),name) 
     465    CALL write_ncdf_var('nav_lon'         ,dimnames,name,Grid%nav_lon    ,'float') 
     466    CALL write_ncdf_var('nav_lat'         ,dimnames,name,Grid%nav_lat    ,'float') 
     467    CALL write_ncdf_var(parent_batmet_name,dimnames,name,Grid%bathy_meter,'float') 
     468    CALL write_ncdf_var('weight'          ,dimnames,name,Grid%wgt        ,'float') 
     469    ! 
     470    CALL copy_ncdf_att('nav_lon'         ,TRIM(parent_bathy_meter),name,MINVAL(Grid%nav_lon),MAXVAL(Grid%nav_lon)) 
     471    CALL copy_ncdf_att('nav_lat'         ,TRIM(parent_bathy_meter),name,MINVAL(Grid%nav_lat),MAXVAL(Grid%nav_lat))   
     472    CALL copy_ncdf_att(parent_batmet_name,TRIM(parent_bathy_meter),name) 
    467473    ! 
    468474    WRITE(*,*) ' ' 
     
    474480  END FUNCTION Write_Bathy_meter 
    475481  ! 
     482  !***************************************************** 
     483  !   function write_domcfg(name,Grid) 
     484  !***************************************************** 
     485 
     486  INTEGER FUNCTION write_domcfg(name,Grid) 
     487     !----------------------------------------- 
     488     ! It creates a domain_cfg.nc used in NEMO4 
     489     !-----------------------------------------     
     490     ! 
     491     USE io_netcdf 
     492     ! 
     493     CHARACTER(*) name 
     494     TYPE(Coordinates) :: Grid 
     495     ! 
     496     INTEGER :: status, ncid 
     497     INTEGER :: nx, ny, jk 
     498     INTEGER :: ln_sco, ln_isfcav, ln_zco, ln_zps, jperio 
     499     REAL*8  :: rpi, rad, rday, rsiyea, rsiday, omega 
     500     ! 
     501     CHARACTER(len=1),     DIMENSION(3)     ::   dimnames 
     502     REAL*8 ,              DIMENSION(N)     ::   e3t_1d, e3w_1d, gdept_1d 
     503     REAL*8 , ALLOCATABLE, DIMENSION(:,:)   ::   ff_t, ff_f 
     504     INTEGER, ALLOCATABLE, DIMENSION(:,:)   ::   bottom_level, top_level 
     505     REAL*8 , ALLOCATABLE, DIMENSION(:,:,:) ::   e3t_0, e3u_0, e3v_0, e3f_0, e3w_0, e3uw_0, e3vw_0 
     506     ! 
     507     ! size of the Grid 
     508     nx = SIZE(Grid%bathy_meter,1) 
     509     ny = SIZE(Grid%bathy_meter,2) 
     510 
     511     ! allocate needed arrays for domain_cfg 
     512     ALLOCATE( ff_t(nx,ny), ff_f(nx,ny) ) 
     513     ALLOCATE( bottom_level(nx,ny), top_level(nx,ny) ) 
     514     ALLOCATE( e3t_0(nx,ny,N), e3u_0 (nx,ny,N), e3v_0 (nx,ny,N), e3f_0(nx,ny,N),  & 
     515        &      e3w_0(nx,ny,N), e3uw_0(nx,ny,N), e3vw_0(nx,ny,N) ) 
     516 
     517     ! some physical parameters 
     518     rpi    = 3.141592653589793 
     519     rad    = 3.141592653589793 / 180. 
     520     rday   = 24.*60.*60. 
     521     rsiyea = 365.25 * rday * 2. * rpi / 6.283076 
     522     rsiday = rday / ( 1. + rday / rsiyea ) 
     523     omega  = 2. * rpi / rsiday 
     524 
     525     ! Coriolis 
     526     ff_f(:,:) = 2. * omega * SIN( rad * Grid%gphif(:,:) )     ! compute it on the sphere at f-point 
     527     ff_t(:,:) = 2. * omega * SIN( rad * Grid%gphit(:,:) )     !    -        -       -    at t-point 
     528 
     529     ! top/bottom levels 
     530     bottom_level(:,:) = Grid%bathy_level(:,:) 
     531     top_level(:,:)    = MIN( 1, bottom_level(:,:) ) 
     532 
     533     ! vertical scale factors 
     534     CALL zgr_z( e3t_1d, e3w_1d, gdept_1d )     
     535     DO jk = 1, N 
     536        e3t_0  (:,:,jk) = e3t_1d  (jk) 
     537        e3u_0  (:,:,jk) = e3t_1d  (jk) 
     538        e3v_0  (:,:,jk) = e3t_1d  (jk) 
     539        e3f_0  (:,:,jk) = e3t_1d  (jk) 
     540        e3w_0  (:,:,jk) = e3w_1d  (jk) 
     541        e3uw_0 (:,:,jk) = e3w_1d  (jk) 
     542        e3vw_0 (:,:,jk) = e3w_1d  (jk) 
     543     END DO 
     544 
     545     ! logicals and others 
     546     ln_sco = 0 
     547     ln_isfcav = 0 
     548     IF( partial_steps ) THEN 
     549        ln_zps = 1 
     550        ln_zco = 0 
     551     ELSE 
     552        ln_zps = 0 
     553        ln_zco = 1 
     554     ENDIF 
     555 
     556     ! closed domain (agrif) 
     557     jperio = 0 
     558 
     559     ! ------------------- 
     560     ! write domain_cfg.nc 
     561     ! ------------------- 
     562     status = nf90_create(name,NF90_WRITE,ncid) 
     563     status = nf90_close(ncid) 
     564     ! 
     565     ! dimensions 
     566     dimnames = (/'x','y','z'/) 
     567     CALL write_ncdf_dim(dimnames(1),name,nx) 
     568     CALL write_ncdf_dim(dimnames(2),name,ny) 
     569     CALL write_ncdf_dim(dimnames(3),name,N) 
     570     !       
     571     ! variables 
     572     CALL write_ncdf_var('nav_lon',dimnames(1:2),name,Grid%nav_lon,'float')       
     573     CALL write_ncdf_var('nav_lat',dimnames(1:2),name,Grid%nav_lat,'float') 
     574     CALL write_ncdf_var('nav_lev',dimnames(3)  ,name,gdept_1d    ,'float') 
     575     ! 
     576     CALL write_ncdf_var('jpiglo',name,nx    ,'integer') 
     577     CALL write_ncdf_var('jpjglo',name,ny    ,'integer') 
     578     CALL write_ncdf_var('jpkglo',name,N     ,'integer') 
     579     CALL write_ncdf_var('jperio',name,jperio,'integer') 
     580     ! 
     581     CALL write_ncdf_var('ln_zco'   ,name,ln_zco   ,'integer') 
     582     CALL write_ncdf_var('ln_zps'   ,name,ln_zps   ,'integer') 
     583     CALL write_ncdf_var('ln_sco'   ,name,ln_sco   ,'integer') 
     584     CALL write_ncdf_var('ln_isfcav',name,ln_isfcav,'integer') 
     585 
     586     CALL write_ncdf_var('glamt',dimnames(1:2),name,Grid%glamt,'double') 
     587     CALL write_ncdf_var('glamu',dimnames(1:2),name,Grid%glamu,'double') 
     588     CALL write_ncdf_var('glamv',dimnames(1:2),name,Grid%glamv,'double') 
     589     CALL write_ncdf_var('glamf',dimnames(1:2),name,Grid%glamf,'double') 
     590     CALL write_ncdf_var('gphit',dimnames(1:2),name,Grid%gphit,'double') 
     591     CALL write_ncdf_var('gphiu',dimnames(1:2),name,Grid%gphiu,'double') 
     592     CALL write_ncdf_var('gphiv',dimnames(1:2),name,Grid%gphiv,'double') 
     593     CALL write_ncdf_var('gphif',dimnames(1:2),name,Grid%gphif,'double')       
     594 
     595     CALL write_ncdf_var('e1t',dimnames(1:2),name,Grid%e1t,'double')       
     596     CALL write_ncdf_var('e1u',dimnames(1:2),name,Grid%e1u,'double')      
     597     CALL write_ncdf_var('e1v',dimnames(1:2),name,Grid%e1v,'double')       
     598     CALL write_ncdf_var('e1f',dimnames(1:2),name,Grid%e1f,'double') 
     599     CALL write_ncdf_var('e2t',dimnames(1:2),name,Grid%e2t,'double') 
     600     CALL write_ncdf_var('e2u',dimnames(1:2),name,Grid%e2u,'double') 
     601     CALL write_ncdf_var('e2v',dimnames(1:2),name,Grid%e2v,'double') 
     602     CALL write_ncdf_var('e2f',dimnames(1:2),name,Grid%e2f,'double') 
     603 
     604     CALL write_ncdf_var('ff_f',dimnames(1:2),name,ff_f,'double') 
     605     CALL write_ncdf_var('ff_t',dimnames(1:2),name,ff_t,'double') 
     606 
     607     CALL write_ncdf_var('e3t_1d',dimnames(3),name,e3t_1d,'double') 
     608     CALL write_ncdf_var('e3w_1d',dimnames(3),name,e3w_1d,'double') 
     609 
     610     CALL write_ncdf_var('e3t_0' ,dimnames(:),name,e3t_0 ,'double') 
     611     CALL write_ncdf_var('e3w_0' ,dimnames(:),name,e3w_0 ,'double') 
     612     CALL write_ncdf_var('e3u_0' ,dimnames(:),name,e3u_0 ,'double') 
     613     CALL write_ncdf_var('e3v_0' ,dimnames(:),name,e3v_0 ,'double') 
     614     CALL write_ncdf_var('e3f_0' ,dimnames(:),name,e3f_0 ,'double') 
     615     CALL write_ncdf_var('e3w_0' ,dimnames(:),name,e3w_0 ,'double') 
     616     CALL write_ncdf_var('e3uw_0',dimnames(:),name,e3uw_0,'double') 
     617     CALL write_ncdf_var('e3vw_0',dimnames(:),name,e3vw_0,'double') 
     618 
     619     CALL write_ncdf_var('bottom_level',dimnames(1:2),name,bottom_level,'integer') 
     620     CALL write_ncdf_var('top_level'   ,dimnames(1:2),name,top_level   ,'integer') 
     621 
     622     CALL write_ncdf_var('bathy_meter' ,dimnames(1:2),name,Grid%bathy_meter,'float') 
     623 
     624     ! some attributes       
     625     CALL copy_ncdf_att('nav_lon',TRIM(parent_coordinate_file),name,MINVAL(Grid%nav_lon),MAXVAL(Grid%nav_lon)) 
     626     CALL copy_ncdf_att('nav_lat',TRIM(parent_coordinate_file),name,MINVAL(Grid%nav_lat),MAXVAL(Grid%nav_lat)) 
     627 
     628     CALL copy_ncdf_att('glamt',TRIM(parent_coordinate_file),name) 
     629     CALL copy_ncdf_att('glamu',TRIM(parent_coordinate_file),name) 
     630     CALL copy_ncdf_att('glamv',TRIM(parent_coordinate_file),name) 
     631     CALL copy_ncdf_att('glamf',TRIM(parent_coordinate_file),name) 
     632     CALL copy_ncdf_att('gphit',TRIM(parent_coordinate_file),name) 
     633     CALL copy_ncdf_att('gphiu',TRIM(parent_coordinate_file),name) 
     634     CALL copy_ncdf_att('gphiv',TRIM(parent_coordinate_file),name) 
     635     CALL copy_ncdf_att('gphif',TRIM(parent_coordinate_file),name) 
     636 
     637     CALL copy_ncdf_att('e1t',TRIM(parent_coordinate_file),name) 
     638     CALL copy_ncdf_att('e1u',TRIM(parent_coordinate_file),name) 
     639     CALL copy_ncdf_att('e1v',TRIM(parent_coordinate_file),name) 
     640     CALL copy_ncdf_att('e1f',TRIM(parent_coordinate_file),name) 
     641     CALL copy_ncdf_att('e2t',TRIM(parent_coordinate_file),name) 
     642     CALL copy_ncdf_att('e2u',TRIM(parent_coordinate_file),name) 
     643     CALL copy_ncdf_att('e2v',TRIM(parent_coordinate_file),name) 
     644     CALL copy_ncdf_att('e2f',TRIM(parent_coordinate_file),name)             
     645     ! 
     646     ! control print 
     647     WRITE(*,*) ' ' 
     648     WRITE(*,*) 'Writing domcfg file: ',name 
     649     WRITE(*,*) ' ' 
     650     ! 
     651     DEALLOCATE( ff_t, ff_f ) 
     652     DEALLOCATE( bottom_level, top_level ) 
     653     DEALLOCATE( e3t_0, e3u_0, e3v_0, e3f_0, e3w_0, e3uw_0, e3vw_0 ) 
     654     !       
     655     write_domcfg = 1 
     656 
     657  END FUNCTION write_domcfg 
     658  ! 
     659  SUBROUTINE zgr_z(e3t_1d, e3w_1d, gdept_1d) 
     660     !!---------------------------------------------------------------------- 
     661     !!                   ***  ROUTINE zgr_z (from NEMO4) *** 
     662     !!                    
     663     !! ** Purpose :   set the depth of model levels and the resulting  
     664     !!      vertical scale factors. 
     665     !! 
     666     !! ** Method  :   z-coordinate system (use in all type of coordinate) 
     667     !!        The depth of model levels is defined from an analytical 
     668     !!      function the derivative of which gives the scale factors. 
     669     !!        both depth and scale factors only depend on k (1d arrays). 
     670     !!              w-level: gdepw_1d  = gdep(k) 
     671     !!                       e3w_1d(k) = dk(gdep)(k)     = e3(k) 
     672     !!              t-level: gdept_1d  = gdep(k+0.5) 
     673     !!                       e3t_1d(k) = dk(gdep)(k+0.5) = e3(k+0.5) 
     674     !! 
     675     !! ** Action  : - gdept_1d, gdepw_1d : depth of T- and W-point (m) 
     676     !!              - e3t_1d  , e3w_1d   : scale factors at T- and W-levels (m) 
     677     !! 
     678     !! Reference : Marti, Madec & Delecluse, 1992, JGR, 97, No8, 12,763-12,766. 
     679     !!---------------------------------------------------------------------- 
     680     INTEGER  ::   jk                   ! dummy loop indices 
     681     INTEGER  ::   jpk 
     682     REAL*8 ::   zt, zw                 ! temporary scalars 
     683     REAL*8 ::   zsur, za0, za1, zkth   ! Values set from parameters in 
     684     REAL*8 ::   zacr, zdzmin, zhmax    ! par_CONFIG_Rxx.h90 
     685     REAL*8 ::   za2, zkth2, zacr2      ! Values for optional double tanh function set from parameters  
     686 
     687     REAL*8, DIMENSION(:), INTENT(inout) ::  e3t_1d, e3w_1d, gdept_1d 
     688     REAL*8, DIMENSION(N)                ::  gdepw_1d 
     689     !!---------------------------------------------------------------------- 
     690     ! 
     691     ! 
     692     ! Set variables from parameters 
     693     ! ------------------------------ 
     694     zkth = ppkth       ;   zacr = ppacr 
     695     zdzmin = ppdzmin   ;   zhmax = pphmax 
     696     zkth2 = ppkth2     ;   zacr2 = ppacr2   ! optional (ldbletanh=T) double tanh parameters 
     697 
     698     ! If pa1 and pa0 and psur are et to pp_to_be_computed 
     699     !  za0, za1, zsur are computed from ppdzmin , pphmax, ppkth, ppacr 
     700    IF ( ( pa0 == 0 .OR. pa1 == 0 .OR. psur == 0 ) & 
     701         .AND. ppdzmin.NE.0 .AND. pphmax.NE.0 ) THEN 
     702        ! 
     703        za1  = (  ppdzmin - pphmax / FLOAT(N-1)  )                                                      & 
     704           & / ( TANH((1-ppkth)/ppacr) - ppacr/FLOAT(N-1) * (  LOG( COSH( (N - ppkth) / ppacr) )      & 
     705           &                                                   - LOG( COSH( ( 1  - ppkth) / ppacr) )  )  ) 
     706        za0  = ppdzmin - za1 *              TANH( (1-ppkth) / ppacr ) 
     707        zsur =   - za0 - za1 * ppacr * LOG( COSH( (1-ppkth) / ppacr )  ) 
     708     ELSE 
     709        za1 = pa1 ;       za0 = pa0 ;          zsur = psur 
     710        za2 = pa2                            ! optional (ldbletanh=T) double tanh parameter 
     711     ENDIF 
     712 
     713     ! Reference z-coordinate (depth - scale factor at T- and W-points) 
     714     ! ====================== 
     715     IF( ppkth == 0. ) THEN            !  uniform vertical grid  
     716 
     717        za1 = zhmax / FLOAT(N-1) 
     718 
     719        DO jk = 1, N 
     720           zw = FLOAT( jk ) 
     721           zt = FLOAT( jk ) + 0.5 
     722           gdepw_1d(jk) = ( zw - 1 ) * za1 
     723           gdept_1d(jk) = ( zt - 1 ) * za1 
     724           e3w_1d  (jk) =  za1 
     725           e3t_1d  (jk) =  za1 
     726        END DO 
     727     ELSE                                ! Madec & Imbard 1996 function 
     728        IF( .NOT. ldbletanh ) THEN 
     729           DO jk = 1, N 
     730              zw = REAL( jk ) 
     731              zt = REAL( jk ) + 0.5 
     732              gdepw_1d(jk) = ( zsur + za0 * zw + za1 * zacr * LOG ( COSH( (zw-zkth) / zacr ) )  ) 
     733              gdept_1d(jk) = ( zsur + za0 * zt + za1 * zacr * LOG ( COSH( (zt-zkth) / zacr ) )  ) 
     734              e3w_1d  (jk) =          za0      + za1        * TANH(       (zw-zkth) / zacr   ) 
     735              e3t_1d  (jk) =          za0      + za1        * TANH(       (zt-zkth) / zacr   ) 
     736           END DO 
     737        ELSE 
     738           DO jk = 1, N 
     739              zw = FLOAT( jk ) 
     740              zt = FLOAT( jk ) + 0.5 
     741              ! Double tanh function 
     742              gdepw_1d(jk) = ( zsur + za0 * zw + za1 * zacr * LOG ( COSH( (zw-zkth ) / zacr  ) )    & 
     743                 &                             + za2 * zacr2* LOG ( COSH( (zw-zkth2) / zacr2 ) )  ) 
     744              gdept_1d(jk) = ( zsur + za0 * zt + za1 * zacr * LOG ( COSH( (zt-zkth ) / zacr  ) )    & 
     745                 &                             + za2 * zacr2* LOG ( COSH( (zt-zkth2) / zacr2 ) )  ) 
     746              e3w_1d  (jk) =          za0      + za1        * TANH(       (zw-zkth ) / zacr  )      & 
     747                 &                             + za2        * TANH(       (zw-zkth2) / zacr2 ) 
     748              e3t_1d  (jk) =          za0      + za1        * TANH(       (zt-zkth ) / zacr  )      & 
     749                 &                             + za2        * TANH(       (zt-zkth2) / zacr2 ) 
     750           END DO 
     751        ENDIF 
     752        gdepw_1d(1) = 0.                    ! force first w-level to be exactly at zero 
     753     ENDIF 
     754 
     755     IF ( ln_e3_dep ) THEN      ! e3. = dk[gdep]    
     756        ! 
     757        !==>>>   need to be like this to compute the pressure gradient with ISF.  
     758        !        If not, level beneath the ISF are not aligned (sum(e3t) /= depth) 
     759        !        define e3t_0 and e3w_0 as the differences between gdept and gdepw respectively 
     760        ! 
     761        DO jk = 1, N-1 
     762           e3t_1d(jk) = gdepw_1d(jk+1)-gdepw_1d(jk) 
     763        END DO 
     764        e3t_1d(N) = e3t_1d(N-1)   ! we don't care because this level is masked in NEMO 
     765 
     766        DO jk = 2, N 
     767           e3w_1d(jk) = gdept_1d(jk) - gdept_1d(jk-1) 
     768        END DO 
     769        e3w_1d(1  ) = 2. * (gdept_1d(1) - gdepw_1d(1)) 
     770     END IF 
     771 
     772     ! 
     773  END SUBROUTINE zgr_z 
     774 
     775 
    476776  !***************************************************** 
    477777  !   function set_child_name(Parentname,Childname) 
     
    501801    !    
    502802  END SUBROUTINE set_child_name 
    503   ! 
    504   !***************************************************** 
    505   !   function set_child_name(Parentname,Childname) 
    506   !***************************************************** 
    507803  ! 
    508804  !***************************************************** 
     
    558854  END SUBROUTINE get_interptype 
    559855  !       
    560   !*****************************************************               
    561   !   end subroutine get_interptype 
    562   !***************************************************** 
    563   !            
    564856  !***************************************************** 
    565857  !   subroutine Init_mask(name,Grid) 
     
    576868    ! 
    577869    IF(jpiglo == 1 .AND. jpjglo == 1) THEN 
    578        CALL Read_Ncdf_var('Bathy_level',name,Grid%Bathy_level) 
     870       CALL read_ncdf_var('Bathy_level',name,Grid%Bathy_level) 
    579871    ELSE 
    580        CALL Read_Ncdf_var('Bathy_level',name,Grid%Bathy_level,(/jpizoom,jpjzoom/),(/jpiglo,jpjglo/) ) 
     872       CALL read_ncdf_var('Bathy_level',name,Grid%Bathy_level,(/jpizoom,jpjzoom/),(/jpiglo,jpjglo/) ) 
    581873    ENDIF 
    582874 
     
    655947  ! 
    656948  !***************************************************** 
    657   !   end subroutine Init_mask 
    658   !***************************************************** 
    659   !  
    660   !***************************************************** 
    661949  !   subroutine Init_Tmask(name,Grid) 
    662950  !***************************************************** 
     
    672960    ! 
    673961    IF(jpiglo == 1 .AND. jpjglo == 1) THEN 
    674        CALL Read_Ncdf_var('Bathy_level',name,Grid%Bathy_level) 
     962       CALL read_ncdf_var('Bathy_level',name,Grid%Bathy_level) 
    675963    ELSE 
    676        CALL Read_Ncdf_var('Bathy_level',name,Grid%Bathy_level,(/jpizoom,jpjzoom/),(/jpiglo,jpjglo/) ) 
     964       CALL read_ncdf_var('Bathy_level',name,Grid%Bathy_level,(/jpizoom,jpjzoom/),(/jpiglo,jpjglo/) ) 
    677965    ENDIF 
    678966    ! 
     
    7121000    TYPE(Coordinates) :: Grid 
    7131001    ! 
    714     CALL Read_Ncdf_var('Bathy_level',filename,Grid%Bathy_level) 
     1002    CALL read_ncdf_var('Bathy_level',filename,Grid%Bathy_level) 
    7151003    !  
    7161004    nx = SIZE(Grid%Bathy_level,1) 
     
    7641052  END SUBROUTINE get_mask 
    7651053  ! 
    766   !***************************************************** 
    767   !   end subroutine get_mask 
    768   !***************************************************** 
    769   !        
    7701054  ! 
    7711055  !***************************************************** 
     
    8031087    ! 
    8041088  END SUBROUTINE write_dimg_var 
    805 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!              
    806 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
     1089 
    8071090END MODULE agrif_readwrite 
Note: See TracChangeset for help on using the changeset viewer.