1     !----------------------------------------------------------------------
  2     !  Copyright (C) 2001--2008 SPMODEL Development Group. All rights reserved.
  3     !----------------------------------------------------------------------
  4     ! Sample program for gtool_history/gtool5 and ISPACK   2002/08/21 S.Takehiro
  5     !                                                      2004/01/26 M.Odaka
  6     !                                                      2009/02/27 Y.Morikawa
  7     !
  8     ! Solving a linear 2-D shallow water system on a sphere 
  9     !     with an isolated mountain
 10     !     du/dt + u0/a\cos\phi du/d\lambda + v/a du0/d\phi - u0v\tan\phi/a 
 11     !           - 2\Omega\sin\phi v = -g/a\cos\phi dh/d\lambda - \nu\lapla^4 u,
 12     !     dv/dt + u0/a\cos\phi dv/d\lambda + 2 u0 u \tan\phi/a 
 13     !           + 2\Omega\sin\phi u  =  -g/a  dh/d\phi - \nu\lapla^4 v,
 14     !     dh/dt + ( 1/\cos\phi d( (H+h0)u+(h-ht)u0 )/d\lambda 
 15     !               + 1/\cos\phi d( (H+h0)v\cos\phi)/d\phi ) = - \nu\lapla^4 h.
 16     !
 17     ! A setup is similar to the experiment of Grose and Hoskins (1979) 
 18     ! with a superrotating rigid-rotation zonal wind profile. 
 19     !
 20       program sp_topo_gtauto
 21     
 22         use w_module
 23         use gtool5
 24         use gtool_historyauto                    ! モジュール指定
 25         implicit none
 26     
 27       !---- 空間解像度設定 ----
 28         integer, parameter :: im=64, jm=32             ! 格子点の設定(X,Y)
 29         integer, parameter :: nm=21
 30  
 31       !---- 変数 ----
 32         real(8)            :: xy_U(0:im-1,jm)          ! 格子点データ(速度経度成分)
 33         real(8)            :: xy_V(0:im-1,jm)          ! 格子点データ(速度緯度成分)
 34         real(8)            :: xy_H(0:im-1,jm)          ! 格子点データ(変位)
                         :
                         : 
 44         real(8)            :: xy_Zeta(0:im-1,jm)       ! 格子点データ(渦度)
 45         real(8)            :: xy_Htopo(0:im-1,jm)      ! 格子点データ(地形)
 46  
 47       !---- 時間積分パラメター ----
 48         real(8):: dt                                   ! 時間間隔 [s]
 49         type(DC_DIFFTIME):: deltime, dispint           ! 時間間隔, 出力時間間隔
 50         type(DC_DIFFTIME):: endtime                    ! 計算終了時間
 51         type(DC_DIFFTIME):: ct                         ! 現在時刻
                         :
                         : 
 68       !------ NAMELIST ファイル名 ------
 69         character(*), parameter:: nmlfile = 'sp_topo_gtauto.nml'
                         :
                         :
 75       !---- 時間積分パラメターの設定 ----
 76         dt = 100.                                      ! 時間間隔 [s]
 77         call DCDiffTimeCreate(deltime, dt, 'sec')      ! 時間間隔
 78         dispint = deltime * 500                        ! 出力時間間隔
 79         endtime = deltime * 10000                      ! 計算終了時間
 80         call DCDiffTimeCreate(ct,      0., 'sec')      ! 現在時刻     
 81
 82       !---------------- 座標値の設定 ---------------------
 83         call w_Initial(nm,im,jm)                ! ISPACK初期化
 84     
 85       !------------------- 初期値設定 ----------------------
 86         xy_U0  = U0*cos(xy_Lat)
 87         xy_H0  = ( Omega*R0*U0/(2*Grav) + U0**2/(4*Grav) )*cos(2*xy_Lat)
 88     
 89         xy_U  = 0 ; xy_V  = 0 ; xy_H  = 0
 90     
 91         w_U0 = w_xy(xy_U0) !; w_H0 = w_xy(xy_H0)
 92         w_U = w_xy(xy_U) ; w_V = w_xy(xy_V) ; w_H = w_xy(xy_H)
                         :
                         : 
107       !------------------- ヒストリー初期設定 ----------------------
108         call output_gtool5_init                        ! ヒストリー初期化
109         call output_gtool5                             ! 初期値出力
110     
111       !------------------- 時間積分 ----------------------
112         do while ( ct <= endtime )
113            if ( mod(ct, dispint) == 0 ) then
114              write(6,*) 'it = ', int( ct / deltime )
115            end if
116     
117            ct = ct + deltime  ! 時刻の進行
118     
119            w_U = ( w_U &
120                    + dt * w_xy( - xy_U0 * xy_GradLon_w(w_U) / R0   &
121                                 - xy_V  * xy_GradLat_w(w_U0) / R0  &
122                                 + xy_U0 * xy_V * tan(xy_Lat) / R0  &
123                                 + 2 * Omega * sin(xy_Lat) * xy_V   &
124                                - Grav * xy_GradLon_w(w_H)/ R0   ) &
125                  )/(1+Nu*(-rn(:,1)/R0**2)**(ndiff/2)*dt)
                         :
                         : 
144            xy_H = xy_w(w_H)
145     
146            call output_gtool5  ! 出力
147         enddo
148     
149         call output_gtool5_close  ! ファイルのクローズ 
150         stop
151     
152       contains
153         subroutine output_gtool5_init
154           write(6,'(a)',advance='NO') '  Input NAMELIST file: '
155           read (5,'(a)') nmlfile
156
157           call HistoryAutoCreate( &                            ! ヒストリー作成
158                title='Shallow water equation on a sphere',             &
159                source='Sample program of gtool_historyauto/gtool5',    &
160                institution='GFD_Dennou Club davis/spmodel project',    &
161                dims=(/'lon','lat','t  '/), dimsizes=(/im,jm,0/),       &
162                longnames=(/'longitude','latitude ','time     '/),      &
163                units=(/'degree_east ','degree_north','sec.        '/), &
164                origin=ct, interval=dispint, terminus=endtime,          &
165                namelist_filename=nmlfile )
166     
167           call HistoryAutoPutAxis('lon',x_Lon*180/pi)              ! 変数出力
168           call HistoryAutoAddAttr('lon','topology','circular')     ! 周期属性
169           call HistoryAutoAddAttr('lon','modulo',360.0)            ! 周期属性
170           call HistoryAutoPutAxis('lat',y_Lat*180/pi)              ! 変数出力
171     
172           call HistoryAutoAddVariable( &                       ! 変数定義
173                varname='h', dims=(/'lon','lat','t  '/), & 
174                longname='surface displacement ', units='m')
175
176           call HistoryAutoAddVariable( &                       ! 変数定義
177                varname='u', dims=(/'lon','lat','t  '/), & 
178                longname='velocity(longitude) ', units='m/s')
179
180           call HistoryAutoAddVariable( &                       ! 変数定義
181                varname='v', dims=(/'lon','lat','t  '/), & 
182                longname='velocity(latitude) ', units='m/s')
183
184           call HistoryAutoAddVariable( &                       ! 変数定義
185                varname='zeta', dims=(/'lon','lat','t  '/), &
186                longname='vorticity', units='1/s')
187
188         end subroutine output_gtool5_init
189         
190         subroutine output_gtool5
191           call HistoryAutoPut(ct, 'u', xy_U)
192           call HistoryAutoPut(ct, 'v', xy_V)
193           call HistoryAutoPut(ct, 'h', xy_H)
194           xy_Zeta = xy_w(w_Divlon_xy(xy_V) - w_Divlat_xy(xy_U))/r0
195           call HistoryAutoPut(ct, 'zeta', xy_Zeta)
196         end subroutine output_gtool5
197
198         subroutine output_gtool5_close
199           call HistoryAutoClose
200         end subroutine output_gtool5_close
201
202       end program sp_topo_gtauto
    netcdf u {
    dimensions:
            lon = 32 ;
            lat = 16 ;
            t = UNLIMITED ; // (21 currently)
    variables:
            float lon(lon) ;
                    lon:long_name = "longitude" ;
                    lon:units = "degree_east" ;
                    lon:topology = "circular" ;
                    lon:modulo = 360.f ;
            float lat(lat) ;
                    lat:long_name = "latitude" ;
                    lat:units = "degree_north" ;
            float t(t) ;
                    t:long_name = "time" ;
                    t:units = "sec." ;
            float u(t, lat, lon) ;
                    u:long_name = "velocity(longitude)" ;
                    u:units = "m/s" ;

    // global attributes:
                    :Conventions = "http://www.gfd-dennou.org/library/gtool4/conventions/" ;
                                     : 
    data:

     t = 0, 50000, 100000, 150000, 200000, 250000, 300000, 350000, 400000, 
        450000, 500000, 550000, 600000, 650000, 700000, 750000, 800000, 850000, 
        900000, 950000, 1000000 ;
    }
 47       !---- 時間積分パラメター ----
 48         real(8):: dt                                   ! 時間間隔 [s]
 49         type(DC_DIFFTIME):: deltime, dispint           ! 時間間隔, 出力時間間隔
                         :
                         : 
 75       !---- 時間積分パラメターの設定 ----
 76         dt = 100.                                      ! 時間間隔 [s]
 77         call DCDiffTimeCreate(deltime, dt, 'sec')      ! 時間間隔
 78         dispint = deltime * 500                        ! 出力時間間隔
                         :
                         : 
157           call HistoryAutoCreate( &                            ! ヒストリー作成
158                title='Shallow water equation on a sphere',             &
159                source='Sample program of gtool_historyauto/gtool5',    &
160                institution='GFD_Dennou Club davis/spmodel project',    &
161                dims=(/'lon','lat','t  '/), dimsizes=(/im,jm,0/),       &
162                longnames=(/'longitude','latitude ','time     '/),      &
163                units=(/'degree_east ','degree_north','sec.        '/), &
164                origin=ct, interval=dispint, terminus=endtime,          &
165                namelist_filename=nmlfile )
166     
    netcdf u {
    dimensions:
            lon = 32 ;
            lat = 16 ;
            t = UNLIMITED ; // (21 currently)
    variables:
                                     : 
            float t(t) ;
                    t:long_name = "time" ;
                    t:units = "day" ;
            float u(t, lat, lon) ;
                    u:long_name = "velocity(longitude)" ;
                    u:units = "m/s" ;

    // global attributes:
                    :Conventions = "http://www.gfd-dennou.org/library/gtool4/conventions/" ;
                                     : 
    data:

     t = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ;
    }
    >ool_historyauto_nml
      IntValue = 1.,             ! 出力間隔の数値
      IntUnit = 'day'            ! 出力間隔の単位
    /
    >ool_historyauto_nml
      Name = 'u, v, h, zeta'  ! 出力変数
    /
    
                                     : 
            float t(t) ;
                    t:long_name = "time" ;
                    t:units = "hour" ;
            float u(t, lat, lon) ;
                    u:long_name = "velocity(longitude)" ;
                    u:units = "m/s" ;
                                     : 
    data:

     t = 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 168, 180, 
       192, 204, 216, 228, 240, 252, 264, 276 ;
    }
                                     : 
            float t(t) ;
                    t:long_name = "time" ;
                    t:units = "day" ;
            float zeta(t, lat, lon) ;
                    zeta:long_name = "vorticity" ;
                    zeta:units = "1/s" ;
                                     : 
    data:

     t = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ;
    }
    !
    ! データ出力の全体設定
    !
    >ool_historyauto_nml
      IntValue = 1.,              ! 出力間隔の数値
      IntUnit = 'day',            ! 出力間隔の単位
    /
    !
    ! データ出力の個別設定
    !
    >ool_historyauto_nml
      Name = 'u, v'               ! 出力変数
      IntValue = 12.,             ! 出力間隔の数値
      IntUnit = 'hour',           ! 出力間隔の単位
    /
    >ool_historyauto_nml
      Name = 'zeta'               ! 出力変数
    /
    

$Id: gtauto_first.rd,v 1.4 2009-10-19 11:56:10 morikawa Exp $