cdfcurl.f90 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. PROGRAM cdfcurl
  2. !!---------------------------------------------------------------------------
  3. !! *** PROGRAM cdfcurl ***
  4. !!
  5. !! ** Purpose: Compute the curl on F-points for given gridU gridV files and variables
  6. !!
  7. !! history :
  8. !! Original : J.M. Molines (May 2005)
  9. !!---------------------------------------------------------------------
  10. !! $Rev: 256 $
  11. !! $Date: 2009-07-21 17:49:27 +0200 (Tue, 21 Jul 2009) $
  12. !! $Id: cdfcurl.f90 256 2009-07-21 15:49:27Z molines $
  13. !!--------------------------------------------------------------
  14. !! * Modules used
  15. USE cdfio
  16. !! * Local variables
  17. IMPLICIT NONE
  18. INTEGER :: ji,jj,jk, jt, ilev, istatus
  19. INTEGER :: npiglo, npjglo, npk, nt
  20. INTEGER :: narg, iargc, ncout, ierr
  21. INTEGER, DIMENSION(2) :: ipk, id_varout !lolo
  22. REAL(kind=8), DIMENSION(:,:), ALLOCATABLE :: e2v, e1u, e1f, e2f
  23. REAL(kind=4), DIMENSION(:,:), ALLOCATABLE :: un_t, vn_t, rotn, taum, tmask, fmask, zun, zvn
  24. REAL(KIND=4) ,DIMENSION(:), ALLOCATABLE :: tim
  25. CHARACTER(LEN=256) :: cfilu, cfilv, cvaru, cvarv, cdum, ctim
  26. CHARACTER(LEN=256) :: cf_mm='mesh_mask.nc', cfileout='curl.nc'
  27. TYPE (variable), DIMENSION(2) :: typvar !: structure for attibutes
  28. !!
  29. narg = iargc()
  30. IF ( narg /= 5 ) THEN
  31. PRINT *,' USAGE : cdfcurl fileU fileV varU varV lev'
  32. PRINT *,' lev is the level where the curl will be computed'
  33. PRINT *,' Produce a cdf file curl.nc with socurl variable'
  34. PRINT *,' Needs mesh_mask.nc'
  35. PRINT *,' '
  36. STOP
  37. ENDIF
  38. CALL getarg(1, cfilu)
  39. CALL getarg(2, cfilv)
  40. CALL getarg(3, cvaru)
  41. CALL getarg(4, cvarv)
  42. CALL getarg(5, cdum)
  43. READ(cdum,*) ilev
  44. ! define new variables for output ( must update att.txt)
  45. typvar(1)%name='socurl'
  46. typvar(1)%units='10^-6 s-1'
  47. typvar(1)%missing_value=-9999.
  48. typvar(1)%valid_min= -1000.
  49. typvar(1)%valid_max= 1000.
  50. typvar(1)%long_name='Relative_Vorticity (curl)'
  51. typvar(1)%short_name='socurl'
  52. typvar(1)%online_operation='N/A'
  53. typvar(1)%axis='TYX'
  54. typvar(2)%name='sotaum'
  55. typvar(2)%units='N/m^2'
  56. typvar(2)%missing_value=-9999.
  57. typvar(2)%valid_min= -1000.
  58. typvar(2)%valid_max= 1000.
  59. typvar(2)%long_name='Wind stress module (on T-point)'
  60. typvar(2)%short_name='sotaum'
  61. typvar(2)%online_operation='N/A'
  62. typvar(2)%axis='TYX'
  63. ipk(:) = 1 ! 2D
  64. npiglo = getdim(cfilu,'x')
  65. npjglo = getdim(cfilu,'y')
  66. npk = getdim(cfilu,'depth')
  67. ctim = 'none'
  68. nt = getdim (cfilu,'time',cdtrue=ctim,kstatus=istatus) !LB
  69. PRINT *, 'npiglo =',npiglo
  70. PRINT *, 'npjglo =',npjglo
  71. PRINT *, 'npk =',npk
  72. PRINT *, 'nt =',nt !PM
  73. PRINT *, 'ilev =',ilev
  74. !test if lev exists
  75. IF ((npk==0) .AND. (ilev .GT. 0) ) THEN
  76. PRINT *, 'Problem : npk = 0 and lev > 0 STOP'
  77. STOP
  78. END IF
  79. ! if forcing field (PM)
  80. IF (ilev==0 .AND. npk==0) THEN
  81. !lforcing=.TRUE.
  82. npk = 1 ; ilev=1
  83. PRINT *, 'npk =0, assume 1'
  84. END IF
  85. IF (nt==0) THEN
  86. PRINT *, 'nt=0, assume 1'
  87. nt=1
  88. END IF
  89. !end (PM)
  90. ! check files and determines if the curl will be 2D of 3D
  91. ! create output fileset
  92. ncout =create(cfileout, cfilu, npiglo,npjglo,0)
  93. ierr= createvar(ncout ,typvar, 2, ipk, id_varout )
  94. ierr= putheadervar(ncout, cfilu, npiglo, npjglo, 0)
  95. ! Allocate the memory
  96. ALLOCATE ( e1u(npiglo,npjglo) , e1f(npiglo,npjglo) )
  97. ALLOCATE ( e2v(npiglo,npjglo) , e2f(npiglo,npjglo) )
  98. ALLOCATE ( un_t(npiglo,npjglo) , vn_t(npiglo,npjglo) )
  99. ALLOCATE ( zun(npiglo,npjglo) , zvn(npiglo,npjglo) )
  100. ALLOCATE ( rotn(npiglo,npjglo) , taum(npiglo,npjglo) )
  101. ALLOCATE ( tmask(npiglo,npjglo) , fmask(npiglo,npjglo) )
  102. ALLOCATE ( tim(nt) )
  103. e1u= getvar(cf_mm, 'e1u', 1,npiglo,npjglo)
  104. e1f= getvar(cf_mm, 'e1f', 1,npiglo,npjglo)
  105. e2v= getvar(cf_mm, 'e2v', 1,npiglo,npjglo)
  106. e2f= getvar(cf_mm, 'e2f', 1,npiglo,npjglo)
  107. fmask = getvar(cf_mm, 'fmask', 1,npiglo,npjglo) ; !lolo
  108. tmask = getvar(cf_mm, 'tmask', 1,npiglo,npjglo) ; !lolo
  109. tim=getvar1d(cfilu,trim(ctim),nt)
  110. ierr=putvar1d(ncout,tim,nt,'T')
  111. DO jt=1,nt
  112. PRINT *, ' * [cdfcurl] jt = ', jt
  113. ! if files are forcing fields
  114. jk = ilev
  115. zun(:,:) = getvar(cfilu, cvaru, jk ,npiglo,npjglo, ktime=jt)
  116. zvn(:,:) = getvar(cfilv, cvarv, jk ,npiglo,npjglo, ktime=jt)
  117. !! VU and VV on T-point:
  118. un_t = 0.
  119. DO ji=2, npiglo
  120. un_t(ji,:) = 0.5*(zun(ji-1,:) + zun(ji,:))*tmask(ji,:)
  121. END DO
  122. vn_t = 0.
  123. DO jj=2, npjglo
  124. vn_t(:,jj) = 0.5*(zvn(:,jj-1) + zvn(:,jj))*tmask(:,jj)
  125. END DO
  126. rotn(:,:) = 0.
  127. DO jj = 1, npjglo -1
  128. DO ji = 1, npiglo -1 ! vector opt.
  129. rotn(ji,jj) = 1.E6 * ( e2v(ji+1,jj ) * zvn(ji+1,jj ) - e2v(ji,jj) * zvn(ji,jj) &
  130. & - e1u(ji ,jj+1) * zun(ji ,jj+1) + e1u(ji,jj) * zun(ji,jj) ) &
  131. & * fmask(ji,jj) / ( e1f(ji,jj) * e2f(ji,jj) )
  132. END DO
  133. END DO
  134. !
  135. rotn(npiglo,:) = rotn(2,:) ; ! periodicity lolo
  136. WHERE ( fmask == 0. ) rotn = -9999.
  137. ! write rotn on file at level k and at time jt
  138. ierr = putvar(ncout, id_varout(1), rotn, 1 ,npiglo, npjglo, jt)
  139. !! Wind stress module at T-point
  140. taum(:,:) = 0.
  141. taum(:,:) = SQRT( un_t(:,:)*un_t(:,:) + vn_t(:,:)*vn_t(:,:) )
  142. taum(1,:) = taum(npiglo-1,:) ; ! periodicity lolo
  143. WHERE ( tmask == 0. ) taum = -9999.
  144. ierr = putvar(ncout, id_varout(2), taum, 1 ,npiglo, npjglo, jt)
  145. END DO
  146. ierr = closeout(ncout)
  147. END PROGRAM cdfcurl