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.
agrif_create_restart.f90 on Ticket #1870 – Attachment – NEMO

Ticket #1870: agrif_create_restart.f90

File agrif_create_restart.f90, 33.5 KB (added by jharlass, 6 years ago)

Clean up code, cover case of unknown variable

Line 
1!
2!************************************************************************
3! Fortran 95 OPA Nesting tools                  *
4!                          *
5!     Copyright (C) 2005 Florian Lemari�(Florian.Lemarie@imag.fr) *
6!                          *
7!************************************************************************
8!
9PROGRAM create_rstrt
10  !
11  USE NETCDF
12  USE bilinear_interp
13  USE bicubic_interp
14  USE agrif_readwrite
15  USE io_netcdf 
16  USE agrif_extrapolation
17  USE agrif_interpolation
18  USE agrif_partial_steps       
19  !
20  IMPLICIT NONE
21  !
22  !************************************************************************
23  !                           *
24  ! PROGRAM  CREATE_RSTRT                    *
25  !                           *
26  ! program to interpolate parent grid restart file to child grid    *
27  !                           *
28  !                           *
29  !Interpolation is carried out using bilinear interpolation      *
30  !routine from SCRIP package                *     
31  !                           *
32  !http://climate.lanl.gov/Software/SCRIP/            *
33  !************************************************************************
34  !
35  ! variables declaration
36  !     
37  CHARACTER*20,DIMENSION(:),POINTER :: Ncdf_varname => NULL()
38  CHARACTER*20 :: vert_coord_name
39  CHARACTER*1 :: posvar
40  CHARACTER*100 :: Child_file,Childcoordinates,varname,Childbathy,Childbathymeter   
41  REAL*8, POINTER, DIMENSION(:,:) :: lonChild,latChild => NULL()
42  REAL*8, POINTER, DIMENSION(:,:) :: lonParent,latParent => NULL()
43  REAL*8, POINTER, DIMENSION(:,:,:) :: tabvar3d,tabinterp3d,mask => NULL()
44  REAL*8, POINTER, DIMENSION(:,:,:) :: fmask,fse3u,fse3v,fse3t => NULL()
45  REAL*8, POINTER, DIMENSION(:,:,:,:) :: un,ub,vn,vb,tn,tb => NULL()
46  REAL*8, POINTER, DIMENSION(:,:,:,:) :: sshn,sshb,sb,sn,gcx,gcxb => NULL()     
47  REAL*8, POINTER, DIMENSION(:,:,:,:) :: tabinterp4d,tabvar1,tabvar2,tabvar3 => NULL()
48  REAL*8, POINTER, DIMENSION(:,:,:,:) :: rotn,rotb,hdivn,hdivb => NULL()
49  REAL*8, POINTER, DIMENSION(:) :: timedepth_temp => NULL()
50  REAL*8, POINTER, DIMENSION(:) :: tabtemp1D,nav_lev => NULL()
51  INTEGER, POINTER, DIMENSION(:) :: tabtemp1DInt => NULL()
52  REAL*8, POINTER, DIMENSION(:,:) :: tabtemp2D,zwf => NULL()
53  REAL*8, POINTER, DIMENSION(:,:) :: e1f,e2f,e1v,e2v,e1u,e2u,e1t,e2t => NULL()
54  REAL*8, POINTER, DIMENSION(:,:,:,:) :: tabtemp4D => NULL()
55  INTEGER,DIMENSION(:),POINTER :: src_add,dst_add  => NULL()
56  REAL*8,DIMENSION(:,:),POINTER :: matrix,bathy_G0 => NULL()
57  LOGICAL,DIMENSION(:,:,:),POINTER :: Tmask => NULL()
58  LOGICAL,DIMENSION(:,:),POINTER :: masksrc => NULL()
59  LOGICAL, DIMENSION(:,:,:), POINTER :: detected_pts
60  LOGICAL :: Interpolation,Extrapolation,Pacifique,op
61  REAL*8 :: za1,za0,zsur,zacr,zkth,zdepth,zdepwp,zmin,zmax,zdiff,ze3tp,ze3wp       
62  INTEGER :: narg,iargc,ncid,x,y,t,z,z_a,x_a,y_a,z_b,nbvert_lev,m
63  REAL*8 :: now_wght,before_wght
64  INTEGER :: i,j,k,status,ji,jj
65  CHARACTER(len=20),DIMENSION(4) :: dimnames
66  CHARACTER(len=80) :: namelistname
67  TYPE(Coordinates) :: G0,G1
68  INTEGER :: jpi,jpj,jpk,jpni,jpnj,jpnij,jpiglo,jpjglo,nlcit,nlcjt,nldit
69  INTEGER :: nldjt,nleit,nlejt,nimppt,njmppt
70  REAL*8 :: tabtemp0dreal
71  INTEGER :: tabtemp0dint
72  CHARACTER(len=20) :: timedimname
73
74  !     
75  ! Variables for dimg
76  !
77  INTEGER :: ino0, it0, ipcg0, isor0, itke0,nfice,nfbulk
78  INTEGER :: irecl8, irec,ndastp,narea,nsolv
79  INTEGER :: jk,kt            ! dummy loop indices
80  INTEGER :: inum             ! temporary logical unit
81  INTEGER :: ios1 , ios2      ! flag for ice and bulk in the current run
82  INTEGER :: ios3             ! flag for free surface.  0 = none 1 = yes.  0 = none 1 = yes
83  INTEGER :: ios4             ! flag for coupled (1) or not (0)   
84  !       
85  narg = iargc()
86  IF (narg == 0) THEN
87     namelistname = 'namelist.input'
88  ELSE
89     CALL getarg(1,namelistname)
90  ENDIF
91  !
92  ! read input file
93  !
94  CALL read_namelist(namelistname)
95  !     
96  IF(TRIM(restart_file) == '/NULL') THEN
97     WRITE(*,*) 'no restart file specified in ',TRIM(namelistname)
98     STOP
99  END IF
100
101  IF (iom_activated) THEN
102     timedimname = 't'
103  ELSE
104     timedimname='time'
105  ENDIF
106
107  !
108  WRITE(*,*) ''
109  WRITE(*,*) 'Interpolation of restart file : ',TRIM(restart_file)
110  WRITE(*,*) ''
111  !
112  CALL Read_Ncdf_VarName(restart_file,Ncdf_varname)
113  !       
114  CALL set_child_name(parent_coordinate_file,Childcoordinates)   
115  CALL set_child_name(parent_meshmask_file,Childbathy) 
116  CALL set_child_name(parent_bathy_meter,Childbathymeter)
117
118  ! create this file
119  !
120  IF( .NOT. dimg ) THEN           
121     CALL set_child_name(restart_file,Child_file)
122     !status = nf90_create(Child_file,NF90_WRITE,ncid)
123     ! cjh, 64 bit offset for >2GB files
124     status = nf90_create(Child_file,cmode=or(NF90_WRITE,NF90_64BIT_OFFSET),ncid=ncid)
125     status = nf90_close(ncid)
126     WRITE(*,*) 'Child grid restart file name = ',TRIM(Child_file)     
127     WRITE(*,*) ''
128  ENDIF
129
130  !
131  ! read dimensions in parent restart file
132  !
133  CALL Read_Ncdf_dim('x',restart_file,x)
134  CALL Read_Ncdf_dim('y',restart_file,y) 
135  CALL Read_Ncdf_dim('z',restart_file,z)
136  CALL Read_Ncdf_dim('x_a',restart_file,x_a)
137  CALL Read_Ncdf_dim('y_a',restart_file,y_a)
138  CALL Read_Ncdf_dim('z_a',restart_file,z_a)
139  CALL Read_Ncdf_dim('z_b',restart_file,z_b)
140
141  IF( z .NE. N ) THEN
142     WRITE(*,*) '***'
143     WRITE(*,*) 'Number of vertical levels doesn t match between namelist and restart file'
144     WRITE(*,*) 'Please check the values in namelist file'
145     STOP
146  ENDIF
147  !
148  ! mask initialization for extrapolation and interpolation
149  !
150  WRITE(*,*) 'mask initialisation on coarse and fine grids'
151  !           
152  status = Read_Local_Coordinates(parent_coordinate_file,G0,(/jpizoom,jpjzoom/),(/x,y/))
153  status = Read_Coordinates(Childcoordinates,G1,Pacifique)
154  !
155  !longitude modification if child domain covers Pacific ocean area
156  !     
157  IF( Pacifique ) THEN
158     !
159     WHERE( G0%nav_lon < 0 )
160        G0%nav_lon = G0%nav_lon + 360.
161     END WHERE
162     !             
163     WHERE( G1%nav_lon < 0 )
164        G1%nav_lon = G1%nav_lon + 360.
165     END WHERE
166     !
167  ENDIF
168  !
169  WRITE(*,*) 'Reading Bathymetry: ',TRIM(parent_bathy_meter)         ! cjh, for partial steps
170  CALL Read_Ncdf_var('Bathymetry',parent_bathy_meter,G0%bathy_meter) ! cjh
171 
172  WRITE(*,*) 'Reading mbathy    : ',TRIM(parent_meshmask_file)
173  CALL Init_mask(parent_meshmask_file,G0,x,y)
174  WRITE(*,*)
175  WRITE(*,*) 'Reading Bathymetry: ',TRIM(Childbathymeter)            ! cjh
176  CALL Read_Ncdf_var('Bathymetry',Childbathymeter,G1%bathy_meter)    ! cjh
177  WRITE(*,*) 'Reading mbathy    : ',TRIM(childbathy)
178  CALL Init_mask(childbathy,G1,1,1)
179
180  G0%tmask = 1.   
181
182  DO k=1,z
183     ALLOCATE(tabvar1(x,y,1,1))
184     CALL Read_Ncdf_var('sn',TRIM(restart_file),tabvar1,1,k)
185     WHERE( tabvar1(:,:,1,1) == 0. ) 
186        G0%tmask(:,:,k) = 0.
187     END WHERE
188     DEALLOCATE(tabvar1)
189  END DO
190  !
191  G0%umask(1:x-1,:,:) = G0%tmask(1:x-1,:,:)*G0%tmask(2:x,:,:)
192  G0%vmask(:,1:y-1,:) = G0%tmask(:,1:y-1,:)*G0%tmask(:,2:y,:)
193  !
194  G0%umask(x,:,:) = G0%tmask(x,:,:)
195  G0%vmask(:,y,:) = G0%tmask(:,y,:)
196  !     
197  G0%fmask(1:x-1,1:y-1,:) = G0%tmask(1:x-1,1:y-1,:)*G0%tmask(2:x,1:y-1,:)* &
198       G0%tmask(1:x-1,2:y,:)*G0%tmask(2:x,2:y,:) 
199  !
200  G0%fmask(x,:,:) = G0%tmask(x,:,:)
201  G0%fmask(:,y,:) = G0%tmask(:,y,:)
202  !
203  !   *****   ***  **   ** ******
204  !   *    *   *   * * * * *
205  !   *    *   *   *  *  * *  ***
206  !   *    *   *   *     * *    *
207  !   *****   ***  *     * ******
208  !
209  IF(dimg) THEN
210     !       
211     WRITE(*,*) 'create dimg restart file'
212     DO m = 7,1000 
213        INQUIRE(Unit=inum,Opened=op)
214        IF( .NOT. op ) THEN
215           inum = m
216           EXIT
217        ENDIF
218     ENDDO
219     !
220     inum = 11
221     irecl8 = nxfin * nyfin * 8
222     OPEN(inum,FILE=TRIM(dimg_output_file),FORM='UNFORMATTED',  &
223          ACCESS='DIRECT',RECL=irecl8)
224     !       
225     CALL Read_Ncdf_var('info',TRIM(restart_file),tabtemp4D)   
226     !       
227     ino0 = NINT(tabtemp4D(1,1,1,1))
228     it0 = NINT(tabtemp4D(1,1,2,1))*rhot
229     WRITE(*,*) 'restart file created for kt = ',it0
230     ipcg0 = NINT(tabtemp4D(1,1,3,1))
231     isor0 = NINT(tabtemp4D(1,1,4,1))
232     itke0 = 0
233     IF(tabtemp4D(1,1,5,1)==1.) itke0 = 1 
234     ndastp = NINT(tabtemp4D(1,1,6,1))
235     ! number of elapsed days since the begining of the run             
236     !
237     DEALLOCATE(tabtemp4D)
238     !
239     IF (isor0 + 1 == 3) THEN
240        isor0 = 2
241        ipcg0 = 2
242     ENDIF
243     !       
244     CALL Read_Ncdf_var('nfice',TRIM(restart_file),tabtemp4D)     
245     nfice = NINT(tabtemp4D(1,1,1,1))
246     DEALLOCATE(tabtemp4D)
247     !
248     CALL Read_Ncdf_var('nfbulk',TRIM(restart_file),tabtemp4D)     
249     nfbulk = NINT(tabtemp4D(1,1,1,1))
250     DEALLOCATE(tabtemp4D)
251     !
252     nfice = 5
253     nfbulk = 5
254     !
255     ios1 = 0
256     ios2 = 0
257     ios3 = 1          ! flag for free surface.  0 = none 1 = yes.  0
258     ios4 = 0
259     narea = 1
260     jpi = nxfin
261     jpj = nyfin
262     jpk = z
263     jpni = 1
264     jpnj = 1
265     jpnij = 1
266     narea = 1
267     jpiglo = nxfin
268     jpjglo = nyfin
269     nlcit = nxfin
270     nlcjt = nyfin
271     nldit = 1
272     nldjt = 1
273     nleit = nxfin
274     nlejt = nyfin
275     nimppt = 1
276     njmppt = 1
277     !
278     PRINT*,'jpi = ',jpi
279     PRINT*,'jpj = ',jpj
280     PRINT*,'jpk = ',jpk
281     PRINT*,'nfice = ',nfice
282     PRINT*,'nfbulk = ',nfbulk
283     PRINT*,'ndastp = ',ndastp
284     !
285     WRITE(inum,REC=1) irecl8, ino0, it0, isor0, ipcg0, itke0, &
286          nfice, nfbulk , ios1, ios2, ios3, ios4, &
287          ndastp, adatrj, jpi, jpj, jpk,  &
288          jpni, jpnj, jpnij, narea, jpiglo, jpjglo, &
289          nlcit, nlcjt, nldit, nldjt, nleit, nlejt, nimppt, njmppt
290     !         
291     irec = 2
292     !
293     !   *****    *****    ******
294     !   *        *    *   *   
295     !   *        *    *   ***
296     !   *        *    *   *   
297     !   *****    *****    * 
298     !
299  ELSE
300
301
302     !
303     ! write dimensions in output file
304     !         
305     CALL Write_Ncdf_dim('x',Child_file,nxfin)
306     CALL Write_Ncdf_dim('y',Child_file,nyfin)
307     CALL Write_Ncdf_dim('z',Child_file,z)
308     CALL Write_Ncdf_dim(TRIM(timedimname),Child_file,0) 
309     IF (.NOT.iom_activated) THEN
310        CALL Write_Ncdf_dim('x_a',Child_file,x_a)
311        CALL Write_Ncdf_dim('y_a',Child_file,y_a)
312        CALL Write_Ncdf_dim('z_a',Child_file,z_a)
313        CALL Write_Ncdf_dim('z_b',Child_file,z_b)
314     ENDIF
315     !
316     !
317  ENDIF
318
319
320  DO i = 1,SIZE(Ncdf_varname)     
321     !     
322     ! loop on variables names
323     !     
324     WRITE(*,*) ''
325     WRITE(*,*) 'Process variables: ',TRIM(Ncdf_varname(i))
326     SELECT CASE (TRIM(Ncdf_varname(i)))
327        !
328        !copy nav_lon from child coordinates to output file     
329        !
330     CASE('nav_lon')
331        IF(.NOT. dimg ) THEN
332           WRITE(*,*) 'copy nav_lon'
333           CALL Read_Ncdf_var('nav_lon',TRIM(Childcoordinates),tabtemp2D) 
334           CALL Write_Ncdf_var('nav_lon',(/'x','y'/),Child_file,tabtemp2D,'float')
335           CALL Copy_Ncdf_att('nav_lon',TRIM(restart_file),Child_file, &
336                MINVAL(tabtemp2D),MAXVAL(tabtemp2D))
337           DEALLOCATE(tabtemp2D)
338           Interpolation = .FALSE.
339        ENDIF
340        !       
341        !copy nav_lat from child coordinates to output file
342        !
343     CASE('nav_lat')             
344        IF(.NOT. dimg ) THEN
345           WRITE(*,*) 'copy nav_lat'
346           CALL Read_Ncdf_var('nav_lat',TRIM(Childcoordinates),tabtemp2D) 
347           CALL Write_Ncdf_var('nav_lat',(/'x','y'/),Child_file,tabtemp2D,'float')
348           CALL Copy_Ncdf_att('nav_lat',TRIM(restart_file),Child_file, &
349                MINVAL(tabtemp2D),MAXVAL(tabtemp2D)) 
350           DEALLOCATE(tabtemp2D)
351           Interpolation = .FALSE.
352        ENDIF
353        !
354        !copy nav_lev from restart_file to output file
355        !
356     CASE('nav_lev')
357
358        WRITE(*,*) 'copy nav_lev'
359        CALL Read_Ncdf_var('nav_lev',TRIM(restart_file),nav_lev) 
360        IF(.NOT. dimg ) THEN
361           CALL Write_Ncdf_var('nav_lev','z',Child_file,nav_lev,'float')
362           CALL Copy_Ncdf_att('nav_lev',TRIM(restart_file),Child_file)     
363        ENDIF
364        Interpolation = .FALSE.
365        !
366        !copy time from restart_file to output file                       
367        !
368     CASE('time')
369        IF(.NOT. dimg ) THEN
370           WRITE(*,*) 'copy time'
371           CALL Read_Ncdf_var('time',TRIM(restart_file),tabtemp1D) 
372           CALL Write_Ncdf_var('time',TRIM(timedimname),Child_file,tabtemp1D,'float')
373           CALL Copy_Ncdf_att('time',TRIM(restart_file),Child_file) 
374           DEALLOCATE(tabtemp1D)
375           Interpolation = .FALSE.
376        ENDIF
377        !copy time from restart_file to output file                       
378        !
379     CASE('time_counter')
380        IF(.NOT. dimg ) THEN
381           WRITE(*,*) 'copy time_counter'
382           CALL Read_Ncdf_var('time_counter',TRIM(restart_file),tabtemp1D) 
383           tabtemp1D = tabtemp1D * rhot
384           CALL Write_Ncdf_var('time_counter',TRIM(timedimname),Child_file,tabtemp1D,'double')
385           CALL Copy_Ncdf_att('time_counter',TRIM(restart_file),Child_file) 
386           DEALLOCATE(tabtemp1D)
387           Interpolation = .FALSE.
388        ENDIF
389        !
390        !copy time_steps from restart_file to output file             
391        !
392     CASE('time_steps')
393        IF(.NOT. dimg ) THEN
394           WRITE(*,*) 'copy time_steps'
395           CALL Read_Ncdf_var('time_steps',TRIM(restart_file),tabtemp1DInt) 
396           CALL Write_Ncdf_var('time_steps',TRIM(timedimname),Child_file,tabtemp1DInt)
397           CALL Copy_Ncdf_att('time_steps',TRIM(restart_file),Child_file) 
398           DEALLOCATE(tabtemp1DInt)
399           Interpolation = .FALSE.   
400        ENDIF
401        !
402        !copy info from restart_file to output file
403        !
404     CASE('info') 
405        IF(.NOT. dimg ) THEN
406           WRITE(*,*) 'copy info'       
407           CALL Read_Ncdf_var('info',TRIM(restart_file),tabtemp4D) 
408           dimnames(1)='x_a'
409           dimnames(2)='y_a'
410           dimnames(3)='z_a'
411           dimnames(4)=TRIM(timedimname)           
412           CALL Write_Ncdf_var('info',dimnames,Child_file,tabtemp4D,'double')
413           CALL Copy_Ncdf_att('info',TRIM(restart_file),Child_file) 
414           DEALLOCATE(tabtemp4D)
415           Interpolation = .FALSE. 
416        ENDIF
417        !
418     CASE('nfice','nfbulk','kt','ndastp','adatrj','rdt','rdttra1','nn_fsbc') 
419        IF(.NOT. dimg ) THEN
420           WRITE(*,*) 'copy ',TRIM(Ncdf_varname(i))
421           IF (iom_activated) THEN
422              CALL Read_Ncdf_var(TRIM(Ncdf_varname(i)),TRIM(restart_file),tabtemp0dreal) 
423              SELECT CASE (TRIM(Ncdf_varname(i)))
424              CASE('rdt','rdttra1')
425                 tabtemp0dreal = tabtemp0dreal/rhot
426              CASE('kt')
427                 tabtemp0dreal = tabtemp0dreal * rhot
428              END SELECT
429              CALL Write_Ncdf_var(TRIM(Ncdf_varname(i)),Child_file,tabtemp0dreal,'double')
430           ELSE
431              CALL Read_Ncdf_var(TRIM(Ncdf_varname(i)),TRIM(restart_file),tabtemp4D) 
432              dimnames(1)='x_a'
433              dimnames(2)='y_a'
434              dimnames(3)='z_b'
435              dimnames(4)=TRIM(timedimname)           
436              CALL Write_Ncdf_var(TRIM(Ncdf_varname(i)),dimnames,Child_file,tabtemp4D,'double')
437              DEALLOCATE(tabtemp4D)
438           ENDIF
439           CALL Copy_Ncdf_att(TRIM(Ncdf_varname(i)),TRIM(restart_file),Child_file) 
440           Interpolation = .FALSE.
441        ENDIF
442        !
443        ! Variable interpolation according to their position on grid
444        !
445        ! grid U - 3D
446     CASE('un','ub','avu','avmu') 
447        ! irec only for DIMG format !
448        varname = Ncdf_varname(i)
449        IF(TRIM(varname)=='un') irec = 6 * z + 2
450        IF(TRIM(varname)=='ub') irec = 2
451        vert_coord_name = 'z'             
452        posvar='U'
453        Interpolation = .TRUE. 
454        ! grid U - 2D
455     CASE('ssu_m','utau_b')
456        varname = Ncdf_varname(i) 
457        vert_coord_name = 'z_b'             
458        posvar='U'
459        Interpolation = .TRUE. 
460        ! grid V - 3D
461     CASE('vn','vb','avmv')
462        varname = Ncdf_varname(i)
463        IF(TRIM(varname)=='vn') irec = 7 * z + 2
464        IF(TRIM(varname)=='vb') irec = 2 + z
465        vert_coord_name = 'z'
466        posvar='V'
467        Interpolation = .TRUE.     
468        ! grid V - 2D
469     CASE('ssv_m','vtau_b')
470        varname = Ncdf_varname(i)
471        vert_coord_name = 'z_b'
472        posvar='V'
473        Interpolation = .TRUE.
474        ! grid T - 3D
475     CASE ('tb','sb','tn','sn','en','avt','avm','dissl','rhop','qsr_hc_b')
476        varname = Ncdf_varname(i) 
477        IF(TRIM(varname)=='sn') irec = 9 * z + 2
478        IF(TRIM(varname)=='tn') irec = 8 * z + 2
479        IF(TRIM(varname)=='sb') irec = 3 * z + 2
480        IF(TRIM(varname)=='tb') irec = 2 * z + 2
481        IF(TRIM(varname)=='tb') irec = 2 * z + 2
482        IF(TRIM(varname)=='en') irec = 12* z + 6
483        vert_coord_name = 'z'
484        posvar='T'
485        Interpolation = .TRUE.           
486        ! grid T - 2D
487     CASE('gcx','gcxb','sshb','sshn','sss_m','sst_m','ssh_m','frq_m','qns_b','emp_b','sfx_b','sbc_hc_b','sbc_sc_b','fraqsr_1lev')
488        varname = Ncdf_varname(i)   
489        IF(TRIM(varname)=='gcx')  irec = 12 * z + 2
490        IF(TRIM(varname)=='gcxb') irec = 12 * z + 3
491        IF(TRIM(varname)=='sshb') irec = 12 * z + 4
492        IF(TRIM(varname)=='sshn') irec = 12 * z + 5
493        vert_coord_name = 'z_b'             
494        posvar='T'
495        Interpolation = .TRUE.     
496        !
497        ! NO interpolation
498     CASE ('rotb','rotn','hdivb','hdivn')
499        Interpolation = .FALSE.
500        !
501     CASE DEFAULT
502        WRITE(*,*) 'No rule for how to proceed with: ',TRIM(varname)
503        WRITE(*,*) 'Add a case to NESTING/src/agrif_create_restart.f90'
504        WRITE(*,*) 'STOP'
505        STOP
506     END SELECT
507     !     
508     IF( Interpolation ) THEN
509        !       
510        IF( vert_coord_name == 'z') THEN
511           nbvert_lev = z 
512        ELSE IF( vert_coord_name == 'z_b') THEN
513           IF (iom_activated) THEN
514              nbvert_lev=1
515           ELSE
516              nbvert_lev = z_b
517           ENDIF
518        END IF
519        !                 
520
521        !
522        t = 1
523
524        ALLOCATE(detected_pts(SIZE(G0%tmask,1),SIZE(G0%tmask,2),nbvert_lev))                             
525        ALLOCATE(tabvar1(x,y,1,2))
526        ALLOCATE(tabvar2(x,y,1,1))
527        ALLOCATE(tabvar3(x,y,1,1))
528        ALLOCATE(masksrc(x,y))
529        ALLOCATE(tabinterp4d(nxfin,nyfin,1,1)) 
530
531        !       
532        DO n = 1,nbvert_lev
533           !
534           WRITE(*,*) 'interpolate/extrapolate ', &
535                TRIM(varname),' (',TRIM(posvar),') for vertical level = ',n   
536
537           CALL Read_Ncdf_var(varname,TRIM(restart_file),tabvar1,t,n)
538           IF(n==1) THEN
539              !                           
540           ELSE IF (n==2) THEN
541              tabvar2(:,:,:,1) = tabvar1(:,:,:,2)
542           ELSE
543              tabvar3(:,:,:,1) = tabvar2(:,:,:,1)
544              tabvar2(:,:,:,1) = tabvar1(:,:,:,2)
545
546           ENDIF
547           !                           
548           SELECT CASE(posvar)
549              !
550           CASE('T')
551              IF(MAXVAL(G1%tmask(:,:,n)) == 0.) THEN
552                 tabinterp4d = 0.0
553                 WRITE(*,*) 'only land points on level T ',n
554              ELSE 
555                 CALL extrap_detect(G0,G1,detected_pts(:,:,n),n)                                           
556
557                 CALL correct_field(detected_pts(:,:,n),tabvar1,tabvar2,&
558                      tabvar3,G0,nav_lev,masksrc,n)                                 
559
560                 SELECT CASE(TRIM(interp_type))
561                 CASE('bilinear')                                                       
562                    CALL get_remap_matrix(G0%nav_lat,G1%nav_lat, &
563                         G0%nav_lon,G1%nav_lon,masksrc,matrix,src_add,dst_add)
564                    CALL make_remap(tabvar1(:,:,1,1),tabinterp4d(:,:,1,1),nxfin,nyfin, &
565                         matrix,src_add,dst_add)     
566                 CASE('bicubic')                                   
567                    CALL get_remap_bicub(G0%nav_lat,G1%nav_lat, &
568                         G0%nav_lon,G1%nav_lon,masksrc,matrix,src_add,dst_add)
569                    CALL make_bicubic_remap(tabvar1(:,:,1,1),masksrc,tabinterp4d(:,:,1,1),&
570                         nxfin,nyfin,matrix,src_add,dst_add) 
571                 END SELECT
572                 !                     
573                 CALL Correctforconservation(tabvar1(:,:,1,1),tabinterp4d(:,:,1,1), &
574                      G0%e1t,G0%e2t,G1%e1t,G1%e2t,nxfin,nyfin,posvar,imin-jpizoom+1,jmin-jpjzoom+1)
575
576                 IF (vert_coord_name == 'z') CALL check_interpextrap(varname,Child_file,tabinterp4d,G1,t,n,posvar)
577
578              ENDIF
579
580              tabinterp4d(:,:,1,1) =  tabinterp4d(:,:,1,1) * G1%tmask(:,:,n)
581              !
582           CASE('U')
583              !
584              IF(MAXVAL(G1%umask(:,:,n)) == 0) THEN
585                 tabinterp4d = 0.0
586                 WRITE(*,*) 'only land points on level U ',n 
587              ELSE
588                 !
589                 CALL extrap_detect(G0,G1,detected_pts(:,:,n),n,'U') 
590                 CALL correct_field(detected_pts(:,:,n),tabvar1,tabvar2,&
591                      tabvar3,G0,nav_lev,masksrc,n,'U')
592                 !                                                           
593                 SELECT CASE(TRIM(interp_type))
594                 CASE('bilinear')                                                       
595                    CALL get_remap_matrix(G0%gphiu,G1%gphiu,   &
596                         G0%glamu,G1%glamu,masksrc,matrix,src_add,dst_add)
597                    CALL make_remap(tabvar1(:,:,1,1),tabinterp4d(:,:,1,1),nxfin,nyfin, &
598                         matrix,src_add,dst_add)     
599                 CASE('bicubic')                                   
600                    CALL get_remap_bicub(G0%gphiu,G1%gphiu,   &
601                         G0%glamu,G1%glamu,masksrc,matrix,src_add,dst_add)
602                    CALL make_bicubic_remap(tabvar1(:,:,1,1),masksrc,tabinterp4d(:,:,1,1),&
603                         nxfin,nyfin,matrix,src_add,dst_add)                       
604                 END SELECT
605                 !                     
606                 CALL Correctforconservation(tabvar1(:,:,1,1),tabinterp4d(:,:,1,1), &
607                      G0%e1u,G0%e2u,G1%e1u,G1%e2u,nxfin,nyfin,posvar,imin-jpizoom+1,jmin-jpjzoom+1)
608
609                 IF (vert_coord_name == 'z') CALL check_interpextrap(varname,Child_file,tabinterp4d,G1,t,n,posvar)
610
611              ENDIF
612
613              tabinterp4d(:,:,1,1) =  tabinterp4d(:,:,1,1) * G1%umask(:,:,n)
614              !
615           CASE('V')
616              !     
617              IF(MAXVAL(G1%vmask(:,:,n)) == 0) THEN
618                 tabinterp4d = 0.0
619                 WRITE(*,*) 'only land points on level V ',n 
620              ELSE
621                 !
622
623                 CALL extrap_detect(G0,G1,detected_pts(:,:,n),n,'V')
624
625                 CALL correct_field(detected_pts(:,:,n),tabvar1,tabvar2,&
626                      tabvar3,G0,nav_lev,masksrc,n,'V')
627                 !                                                           
628                 SELECT CASE(TRIM(interp_type))
629                 CASE('bilinear')                                                       
630                    CALL get_remap_matrix(G0%gphiv,G1%gphiv,   &
631                         G0%glamv,G1%glamv,masksrc,matrix,src_add,dst_add)
632                    CALL make_remap(tabvar1(:,:,1,1),tabinterp4d(:,:,1,1),nxfin,nyfin, &
633                         matrix,src_add,dst_add)     
634                 CASE('bicubic')                                   
635                    CALL get_remap_bicub(G0%gphiv,G1%gphiv,   &
636                         G0%glamv,G1%glamv,masksrc,matrix,src_add,dst_add)
637                    CALL make_bicubic_remap(tabvar1(:,:,1,1),masksrc,tabinterp4d(:,:,1,1),&
638                         nxfin,nyfin,matrix,src_add,dst_add)                       
639                 END SELECT
640                 !                     
641                 CALL Correctforconservation(tabvar1(:,:,1,1),tabinterp4d(:,:,1,1), &
642                      G0%e1v,G0%e2v,G1%e1v,G1%e2v,nxfin,nyfin,posvar,imin-jpizoom+1,jmin-jpjzoom+1)
643
644                 IF (vert_coord_name == 'z') CALL check_interpextrap(varname,Child_file,tabinterp4d,G1,t,n,posvar)
645
646              ENDIF
647
648              tabinterp4d(:,:,1,1) =  tabinterp4d(:,:,1,1) * G1%vmask(:,:,n)
649              !
650           END SELECT
651           !
652           IF(dimg) THEN
653              !
654              WRITE(inum,REC=irec) tabinterp4d(:,:,1,1)
655              irec = irec + 1
656              !
657           ELSE
658              !
659              dimnames(1)='x'
660              dimnames(2)='y'
661              IF ((iom_activated).AND.(vert_coord_name == 'z_b')) THEN
662                 dimnames(3)=TRIM(timedimname)
663              ELSE
664                 dimnames(3)=vert_coord_name
665                 dimnames(4)=TRIM(timedimname)
666              ENDIF
667              !             
668              IF(TRIM(varname)=='gcx' .OR. TRIM(varname)=='gcxb') THEN
669                 PRINT*,TRIM(varname),MAXVAL(tabinterp4d),MINVAL(tabinterp4d)
670              ENDIF
671              IF ((iom_activated).AND.(vert_coord_name == 'z_b')) THEN
672                 ALLOCATE(tabvar3d(SIZE(tabinterp4d,1),SIZE(tabinterp4d,2),SIZE(tabinterp4d,3)))
673                 tabvar3d=tabinterp4d(:,:,:,1)
674                 CALL Write_Ncdf_var(TRIM(varname),dimnames, &
675                      Child_file,tabvar3d,t,'double')
676                 DEALLOCATE(tabvar3d)
677              ELSE
678                 CALL Write_Ncdf_var(TRIM(varname),dimnames, &
679                      Child_file,tabinterp4d,t,n,'double')
680              ENDIF
681              !
682              CALL Copy_Ncdf_att(TRIM(varname),TRIM(restart_file),Child_file)
683              !
684           ENDIF
685           !
686           IF(ASSOCIATED(matrix)) DEALLOCATE(matrix,src_add,dst_add)   
687           !
688        END DO
689        !
690        DEALLOCATE(detected_pts)
691        DEALLOCATE(tabinterp4d)
692        DEALLOCATE(tabvar1,tabvar2,tabvar3)
693        DEALLOCATE(masksrc) 
694        !                     
695     ENDIF
696
697  END DO
698  !
699  !
700  !
701  !
702  !
703  !
704  !
705  !
706  !
707  ALLOCATE(rotn(nxfin,nyfin,z,1),rotb(nxfin,nyfin,z,1))
708  ALLOCATE(hdivn(nxfin,nyfin,z,1),hdivb(nxfin,nyfin,z,1))
709  !                         
710  !
711  IF(dimg) THEN         
712     ALLOCATE(un(nxfin,nyfin,z,1),ub(nxfin,nyfin,z,1))
713     ALLOCATE(vn(nxfin,nyfin,z,1),vb(nxfin,nyfin,z,1))
714     irec = 6 * z + 2
715     CALL read_dimg_var(inum,irec,un,z) 
716     irec = 2
717     CALL read_dimg_var(inum,irec,ub,z)
718     irec = 7 * z + 2
719     CALL read_dimg_var(inum,irec,vn,z)
720     irec = 2 + z
721     CALL read_dimg_var(inum,irec,vb,z)                     
722  ELSE
723     CALL Read_Ncdf_var('un',Child_file,un)     
724     CALL Read_Ncdf_var('vn',Child_file,vn)
725     !       
726     CALL Read_Ncdf_var('ub',Child_file,ub)
727     CALL Read_Ncdf_var('vb',Child_file,vb)
728  ENDIF
729  !
730
731  IF(rhot == 1) THEN
732     WRITE(*,*) ''
733     WRITE(*,*) 'no time interpolation (time refinement ratio = 1)'
734  ELSE   
735     WRITE(*,*) ''
736     WRITE(*,*) 'time interpolation'
737     now_wght = (rhot-1.)/rhot
738     before_wght = 1./rhot
739     !   
740     ub = now_wght*un + before_wght*ub
741     vb = now_wght*vn + before_wght*vb
742     !-----------------------                 
743     IF(dimg) THEN
744        ALLOCATE(tn(nxfin,nyfin,z,1),tb(nxfin,nyfin,z,1))
745        irec = 8 * z + 2
746        CALL read_dimg_var(inum,irec,tn,z)
747        irec = 2 * z + 2
748        CALL read_dimg_var(inum,irec,tb,z)               
749     ELSE
750        CALL Read_Ncdf_var('tb',Child_file,tb)
751        CALL Read_Ncdf_var('tn',Child_file,tn)
752     ENDIF
753     !----------------------               
754     tb = now_wght*tn + before_wght*tb
755
756     IF(dimg) THEN
757        irec = 2 * z + 2
758        CALL write_dimg_var(inum,irec,tb,z)               
759     ELSE
760        dimnames(1)='x'
761        dimnames(2)='y'
762        dimnames(3)='z'
763        dimnames(4)=TRIM(timedimname)
764        CALL Write_Ncdf_var('tb',dimnames,Child_file,tb,'double')
765     ENDIF
766     !
767     DEALLOCATE(tn,tb)
768     !----------------------         
769     IF(dimg) THEN
770        ALLOCATE(sn(nxfin,nyfin,z,1),sb(nxfin,nyfin,z,1))
771        irec = 9 * z + 2
772        CALL read_dimg_var(inum,irec,sn,z)
773        irec = 3 * z + 2
774        CALL read_dimg_var(inum,irec,sb,z)             
775     ELSE         
776        CALL Read_Ncdf_var('sb',Child_file,sb)
777        CALL Read_Ncdf_var('sn',Child_file,sn)           
778     ENDIF
779     !----------------------               
780     sb = now_wght*sn + before_wght*sb
781
782     IF(dimg) THEN
783        irec = 3 * z + 2
784        CALL write_dimg_var(inum,irec,sb,z)               
785     ELSE               
786        dimnames(1)='x'
787        dimnames(2)='y'
788        dimnames(3)='z'
789        dimnames(4)=TRIM(timedimname)
790        CALL Write_Ncdf_var('sb',dimnames,Child_file,sb,'double')
791     ENDIF
792     !----------------------                             
793     DEALLOCATE(sn,sb)
794     !         
795     IF(dimg) THEN
796        ALLOCATE(gcx(nxfin,nyfin,1,1),gcxb(nxfin,nyfin,1,1))
797        irec = 12 * z + 2
798        CALL read_dimg_var(inum,irec,gcx,1)
799        irec = 12 * z + 3
800        CALL read_dimg_var(inum,irec,gcxb,1) 
801     ELSE 
802        CALL Read_Ncdf_var('gcx',Child_file,gcx)
803        CALL Read_Ncdf_var('gcxb',Child_file,gcxb)
804     ENDIF
805     !----------------------               
806     gcxb = now_wght*gcx + before_wght*gcxb
807
808     IF(dimg) THEN
809        irec = 12 * z + 3
810        CALL write_dimg_var(inum,irec,gcxb,1)               
811     ELSE               
812        dimnames(1)='x'
813        dimnames(2)='y'
814        dimnames(3)='z_b'
815        dimnames(4)=TRIM(timedimname)
816        CALL Write_Ncdf_var('gcxb',dimnames,Child_file,gcxb,'double')
817     ENDIF
818     !-----------------------               
819     PRINT*,' gcx = ',MAXVAL(gcx),MINVAL(gcx)
820     PRINT*,' gcxb = ',MAXVAL(gcxb),MINVAL(gcxb)
821
822     DEALLOCATE(gcx,gcxb)
823     !
824     IF(dimg) THEN
825        ALLOCATE(sshn(nxfin,nyfin,1,1),sshb(nxfin,nyfin,1,1))
826        irec = 12 * z + 5
827        CALL read_dimg_var(inum,irec,sshn,1)
828        irec = 12 * z + 4
829        CALL read_dimg_var(inum,irec,sshb,1) 
830     ELSE         
831        CALL Read_Ncdf_var('sshb',Child_file,sshb)
832        CALL Read_Ncdf_var('sshn',Child_file,sshn)
833     ENDIF
834     !----------------------               
835     sshb = now_wght*sshn + before_wght*sshb
836
837     IF(dimg) THEN
838        irec = 12 * z + 4
839        CALL write_dimg_var(inum,irec,sshb,1)               
840     ELSE         
841        dimnames(1)='x'
842        dimnames(2)='y'
843        dimnames(3)='z_b'
844        dimnames(4)=TRIM(timedimname)
845        CALL Write_Ncdf_var('sshb',dimnames,Child_file,sshb,'double')
846     ENDIF
847     !               
848     DEALLOCATE(sshb,sshn) 
849
850     !   
851  ENDIF
852  !
853  WRITE(*,*) 'Compute hdivn,rotn with new interpolated fields ...'
854  !
855  !fmask:land/ocean mask at f-point (=0. or 1.)=shlat along lateral boundaries
856  !
857  ALLOCATE(fse3u(nxfin,nyfin,z),fse3v(nxfin,nyfin,z),fse3t(nxfin,nyfin,z)) 
858  !     
859  IF(partial_steps) THEN
860     status = Read_Bathymeter(TRIM(Childbathymeter),G1)
861     CALL get_scale_factors( G1,fse3t,fse3u,fse3v )
862  ELSE       
863     fse3t(:,:,:) = 1.0
864     fse3u(:,:,:) = 1.0
865     fse3v(:,:,:) = 1.0
866  ENDIF
867  !
868  !
869  DO k = 1,z 
870     !   
871     DO j = 2,nyfin-1
872        DO i = 2, nxfin-1
873           !
874           hdivn(i,j,k,1) = (G1%e2u(i,j)*fse3u(i,j,k)*un(i,j,k,1)-G1%e2u(i-1,j)*fse3u(i-1,j,k)*un(i-1,j,k,1)      &
875                +    G1%e1v(i,j)*fse3v(i,j,k)*vn(i,j,k,1)-G1%e1v(i,j-1)*fse3v(i,j-1,k)*vn(i,j-1,k,1))   & 
876                / ( G1%e1t(i,j) * G1%e2t(i,j) * fse3t(i,j,k) )
877           !
878           hdivb(i,j,k,1) = (G1%e2u(i,j)*fse3u(i,j,k)*ub(i,j,k,1)-G1%e2u(i-1,j)*fse3u(i-1,j,k)*ub(i-1,j,k,1)      &
879                +    G1%e1v(i,j)*fse3v(i,j,k)*vb(i,j,k,1)-G1%e1v(i,j-1)*fse3v(i,j-1,k)*vb(i,j-1,k,1))   & 
880                / ( G1%e1t(i,j) * G1%e2t(i,j) * fse3t(i,j,k) )
881           !         
882        END DO
883     END DO
884     !
885     !
886     hdivn(1:2,:,k,1) = 0.
887     hdivn(:,1:2,k,1) = 0.
888     hdivn(nxfin-1:nxfin,:,k,1) = 0.
889     hdivn(:,nyfin-1:nyfin,k,1) = 0.
890     hdivb(1:2,:,k,1) = 0.
891     hdivb(:,1:2,k,1) = 0.
892     hdivb(nxfin-1:nxfin,:,k,1) = 0.
893     hdivb(:,nyfin-1:nyfin,k,1) = 0.         
894     !   
895     DO j = 1, nyfin-1
896        DO i = 1, nxfin-1
897           !
898           rotn(i,j,k,1) = (G1%e2v(i+1,j)*vn(i+1,j,k,1)-G1%e2v(i,j)*vn(i,j,k,1)    &
899                - G1%e1u(i,j+1)*un(i,j+1,k,1)+G1%e1u(i,j)*un(i,j,k,1)) &
900                * G1%fmask(i,j,k) / ( G1%e1f(i,j) * G1%e2f(i,j))
901           !
902           rotb(i,j,k,1) = (G1%e2v(i+1,j)*vb(i+1,j,k,1)-G1%e2v(i,j)*vb(i,j,k,1)    &
903                - G1%e1u(i,j+1)*ub(i,j+1,k,1)+G1%e1u(i,j)*ub(i,j,k,1)) &
904                * G1%fmask(i,j,k) / ( G1%e1f(i,j) * G1%e2f(i,j))
905           !             
906        END DO
907     END DO
908     !
909  END DO
910  !
911  PRINT*,' hdivn = ',MAXVAL(hdivn(2:nxfin-1,2:nyfin-1,:,1)),MINVAL(hdivn(2:nxfin-1,2:nyfin-1,:,1))
912  PRINT*,' hdivb = ',MAXVAL(hdivb(2:nxfin-1,2:nyfin-1,:,1)),MINVAL(hdivb(2:nxfin-1,2:nyfin-1,:,1))
913  PRINT*,' rotn  = ',MAXVAL(rotn(2:nxfin-1,2:nyfin-1,:,1)),MINVAL(rotn(2:nxfin-1,2:nyfin-1,:,1))
914  PRINT*,' rotb  = ',MAXVAL(rotb(2:nxfin-1,2:nyfin-1,:,1)),MINVAL(rotb(2:nxfin-1,2:nyfin-1,:,1))
915  !
916  IF(dimg) THEN
917     !
918     irec = 10 * z + 2
919     DO k=1,z
920        WRITE(inum,REC=irec) rotn(:,:,k,1)
921        irec = irec+1
922     ENDDO
923     !         
924     irec = 4 * z + 2
925     DO k=1,z
926        WRITE(inum,REC=irec) rotb(:,:,k,1)
927        irec = irec+1
928     ENDDO
929     !         
930     irec = 11 * z + 2
931     DO k=1,z
932        WRITE(inum,REC=irec) hdivn(:,:,k,1)
933        irec = irec+1
934     ENDDO
935     !         
936     irec = 5 * z + 2
937     DO k=1,z
938        WRITE(inum,REC=irec) hdivb(:,:,k,1)
939        irec = irec+1
940     ENDDO
941     !         
942     CLOSE(inum)
943  ELSE
944     dimnames(1)='x'
945     dimnames(2)='y'
946     dimnames(3)='z'
947     dimnames(4)=TRIM(timedimname)
948     CALL Write_Ncdf_var('rotn',dimnames,Child_file,rotn,'double')
949     CALL Copy_Ncdf_att('rotn',TRIM(restart_file),Child_file)
950     CALL Write_Ncdf_var('hdivn',dimnames,Child_file,hdivn,'double')
951     CALL Copy_Ncdf_att('hdivn',TRIM(restart_file),Child_file)
952     CALL Write_Ncdf_var('rotb',dimnames,Child_file,rotb,'double')
953     CALL Copy_Ncdf_att('rotb',TRIM(restart_file),Child_file)
954     CALL Write_Ncdf_var('hdivb',dimnames,Child_file,hdivb,'double')
955     CALL Copy_Ncdf_att('hdivb',TRIM(restart_file),Child_file)
956  ENDIF
957  !
958  WRITE(*,*) ' '
959  WRITE(*,*) '******* restart file successfully created *******' 
960  WRITE(*,*) ' '
961  !
962  STOP
963END PROGRAM create_rstrt
964