Path: | physics/phy_ape_test.f90 |
Last Update: | Fri Oct 12 04:54:55 JST 2007 |
Authors: | Yukiko YAMADA, Yasuhiro MORIKAWA |
Version: | $Id: phy_ape_test.f90,v 1.5 2007/10/11 19:54:55 morikawa Exp $ |
Tag Name: | $Name: dcpam4-20071012 $ |
Copyright: | Copyright (C) GFD Dennou Club, 2007. All rights reserved. |
License: | See COPYRIGHT |
Note that Japanese and English are described in parallel.
phy_ape モジュールの動作テストを行うためのプログラムです. このプログラムがコンパイルできること, および実行時に プログラムが正常終了することを確認してください.
This program checks the operation of "phy_ape" module. Confirm compilation and execution of this program.
Main Program : |
program phy_ape_test use phy_ape, only: PHYAPE, Create, Close, PutLine, initialized, PhysicsAPE use constants, only: CONST, Create, Get use dc_test, only: AssertEqual use dc_types, only: DP, STRING use dc_string, only: StoA use dc_args, only: ARGS, Open, HelpMsg, Option, Debug, Help, Strict, Close use gt4_history, only: HistoryGet use gt4_history, only: GT_HISTORY, HistoryCreate, HistoryAddVariable, HistoryPut, HistoryClose, HistoryAddAttr implicit none !--------------------------------------------------------- ! 実験の表題, モデルの名称, 所属機関名 ! Title of a experiment, name of model, sub-organ !--------------------------------------------------------- character(*), parameter:: title = 'phy_ape_test $Name: dcpam4-20071012 $ :: ' // 'Test program of "phy_ape" module' character(*), parameter:: source = 'dcpam4 ' // '(See http://www.gfd-dennou.org/library/dcpam)' character(*), parameter:: institution = 'GFD Dennou Club (See http://www.gfd-dennou.org)' !------------------------------------------------------------------- ! 格子点数・最大全波数 ! Grid points and maximum truncated wavenumber !------------------------------------------------------------------- integer, parameter:: imax = 64 ! 経度格子点数. ! Number of grid points in longitude integer, parameter:: jmax = 32 ! 緯度格子点数. ! Number of grid points in latitude integer, parameter:: kmax = 20 ! 鉛直層数. ! Number of vertical level !----------------------------------------------------------------- ! 物理定数等の設定 ! Configure physical constants etc. !----------------------------------------------------------------- type(CONST):: const_earth real(DP):: PI ! $ \pi $ . 円周率. Circular constant real(DP):: RAir ! $ R $ . 大気気体定数. Gas constant of air real(DP):: Grav ! $ g $ . 重力加速度. Gravitational acceleration real(DP):: Cp ! $ C_p $ . 大気定圧比熱. Specific heat of air at constant pressure real(DP):: EL ! $ L $ . 水の凝結の潜熱. Latent heat of condensation of water vapor real(DP):: RVap ! $ R_v $ . 水蒸気気体定数. Gas constant of water vapor real(DP):: EpsV ! $ \epsilon_v $ . 水蒸気分子量比. Molecular weight of water vapor real(DP):: ES0 ! $ e^{*} $ (273K) . 0 ℃での飽和蒸気圧. Saturated vapor pressure at 0 degrees C real(DP):: StB ! $ \sigma_{SB} $ . ステファンボルツマン定数. Stefan-Boltzmann constant real(DP):: FKarm ! $ k $ . カルマン定数. Karman constant real(DP):: DelTime ! $ \Delta t $ . タイムステップ. Time step !--------------------------------------------------------- ! 軸データ ! Axes data !--------------------------------------------------------- real(DP):: x_Lon (0:imax-1) ! 経度. Longitude real(DP):: x_Lon_Weight(0:imax-1) ! 経度座標重み. ! Weight of longitude real(DP):: y_Lat (0:jmax-1) ! 緯度. Latitude real(DP):: y_Lat_Weight(0:jmax-1) ! 緯度座標重み. ! Weight of latitude real(DP):: z_Sigma (0:kmax-1) ! $ \sigma $ レベル (整数). ! Full $ \sigma $ level real(DP):: r_Sigma (0:kmax) ! $ \sigma $ レベル (半整数). ! Half $ \sigma $ level !--------------------------------------------------------- ! 物理量 ! Physical values !--------------------------------------------------------- real(DP):: xyz_U (0:imax-1, 0:jmax-1, 0:kmax-1) ! $ U $ . 東西風速. Zonal wind real(DP):: xyz_V (0:imax-1, 0:jmax-1, 0:kmax-1) ! $ V $ . 南北風速. Meridional wind real(DP):: xyz_Temp (0:imax-1, 0:jmax-1, 0:kmax-1) ! $ T $ . 温度. Temperature real(DP):: xy_Ps (0:imax-1, 0:jmax-1) ! $ P_s $ . 地表面気圧. Surface pressure real(DP):: xyz_QVap (0:imax-1, 0:jmax-1, 0:kmax-1) ! $ q $ . 比湿. Specific humidity !--------------------------------------------------------- ! 作業変数 ! Work variables !--------------------------------------------------------- type(ARGS):: arg ! コマンドライン引数. ! Command line arguments logical:: OPT_namelist ! -N, --namelist オプションの有無. ! Existence of '-N', '--namelist' option character(STRING):: VAL_namelist ! -N, --namelist オプションの値. ! Value of '-N', '--namelist' option type(PHYAPE):: phy_ape00, phy_ape01, phy_ape02, phy_ape03 logical:: err type(GT_HISTORY):: gthist continue !--------------------------------------------------------- ! コマンドライン引数の処理 ! Command line arguments handling !--------------------------------------------------------- call Open( arg ) call HelpMsg( arg, 'Title', title ) call HelpMsg( arg, 'Usage', './phy_ape_test [Options]' ) call HelpMsg( arg, 'Source', source ) call HelpMsg( arg, 'Institution', institution ) call Option( arg, StoA('-N', '--namelist'), OPT_namelist, VAL_namelist, help = "NAMELIST filename" ) call Debug( arg ) call Help( arg ) call Strict( arg, severe = .true. ) call Close( arg ) !--------------------------------------------------------- ! 物理定数の設定 ! Configure a physical constant !--------------------------------------------------------- call Create( constant = const_earth ) ! (inout) call Get( constant = const_earth, PI = PI, RAir = RAir, Grav = Grav, Cp = Cp, EL = EL, RVap = RVap, EpsV = EpsV, ES0 = ES0, StB = StB, FKarm = FKarm ) ! (out) DelTime = 360.0_DP !--------------------------------------------------------- ! 軸データ取得 ! Get axes data !--------------------------------------------------------- call HistoryGet ( file = 'phy_ape_test01.nc', varname = 'lon', array = x_Lon ) ! (out) x_Lon = x_Lon * PI / 180.0_DP call HistoryGet ( file = 'phy_ape_test01.nc', varname = 'lon_weight', array = x_Lon_Weight ) ! (out) call HistoryGet ( file = 'phy_ape_test01.nc', varname = 'lat', array = y_Lat ) ! (out) y_Lat = y_Lat * PI / 180.0_DP call HistoryGet ( file = 'phy_ape_test01.nc', varname = 'lat_weight', array = y_Lat_Weight ) ! (out) call HistoryGet ( file = 'phy_ape_test01.nc', varname = 'sig', array = z_Sigma ) ! (out) call HistoryGet ( file = 'phy_ape_test01.nc', varname = 'sigm', array = r_Sigma ) ! (out) !--------------------------------------------------------- ! 初期設定テスト ! Initialization test !--------------------------------------------------------- call Create( phy_ape = phy_ape00, imax = imax, jmax = jmax, kmax = kmax, x_Lon = x_Lon, y_Lat = y_Lat, z_Sigma = z_Sigma, r_Sigma = r_Sigma, PI = PI, RAir = RAir, Grav = Grav, Cp = Cp, EL = EL, RVap = RVap, EpsV = EpsV, ES0 = ES0, StB = StB, FKarm = FKarm, DelTime = DelTime, x_Lon_Weight = x_Lon_Weight, y_Lat_Weight = y_Lat_Weight, current_time_value = 360.0_DP, current_time_unit = 'sec', nmlfile = VAL_namelist ) ! (in) call AssertEqual( 'initialization test 1', answer = .true., check = initialized(phy_ape00) ) call PutLine( phy_ape = phy_ape00 ) ! (in) !--------------------------------------------------------- ! PhysicsAPE テスト ! PhysicsAPE test !--------------------------------------------------------- call HistoryGet( file = 'phy_ape_test01.nc', varname = 'U', array = xyz_U ) ! (out) call HistoryGet( file = 'phy_ape_test01.nc', varname = 'V', array = xyz_V ) ! (out) call HistoryGet( file = 'phy_ape_test01.nc', varname = 'Temp', array = xyz_Temp ) ! (out) call HistoryGet( file = 'phy_ape_test01.nc', varname = 'QVap', array = xyz_QVap ) ! (out) call HistoryGet( file = 'phy_ape_test01.nc', varname = 'Ps', array = xy_Ps ) ! (out) call PhysicsAPE( phy_ape = phy_ape00, xyz_U = xyz_U, xyz_V = xyz_V, xyz_Temp = xyz_Temp, xy_Ps = xy_Ps, xyz_QVap = xyz_QVap ) ! (inout) !--------------------------------------------------------- ! 終了処理テスト ! Termination test !--------------------------------------------------------- call Close( phy_ape = phy_ape00 ) ! (inout) call AssertEqual( 'termination test 1', answer = .false., check = initialized(phy_ape00) ) call PutLine( phy_ape = phy_ape00 ) ! (in) call Close( phy_ape = phy_ape02, err = err ) ! (out) call AssertEqual( 'termination test 2', answer = .true., check = err ) !---------------------------------------------------------------- ! データ出力 ! Output data !---------------------------------------------------------------- call HistoryCreate( history = gthist, file = 'phy_ape_test02.nc', title = title, source = source, institution = institution, dims = StoA('lon', 'lat', 'sig', 'sigm'), dimsizes = (/imax, jmax, kmax, kmax + 1/), longnames = StoA('longitude', 'latitude', 'sigma at layer midpoints', 'sigma at layer end-points (half level)'), units = StoA('degree_east', 'degree_north', '1', '1') ) ! (out) call HistoryPut( history = gthist, varname = 'lon', array = x_Lon * 180.0_DP / PI ) ! (in) call HistoryPut( history = gthist, varname = 'lat', array = y_Lat * 180.0_DP / PI ) ! (in) call HistoryPut( history = gthist, varname = 'sig', array = z_Sigma ) ! (in) call HistoryPut( history = gthist, varname = 'sigm', array = r_Sigma ) ! (in) call HistoryAddAttr( history = gthist, varname = 'lon', attrname = 'standard_name', value = 'longitude' ) ! (in) call HistoryAddAttr( history = gthist, varname = 'lat', attrname = 'standard_name', value = 'latitude' ) ! (in) call HistoryAddAttr( history = gthist, varname = 'sig', attrname = 'standard_name', value = 'atmosphere_sigma_coordinate' ) ! (in) call HistoryAddAttr( history = gthist, varname = 'sigm', attrname = 'standard_name', value = 'atmosphere_sigma_coordinate' ) ! (in) call HistoryAddAttr( history = gthist, varname = 'sig', attrname = 'positive', value = 'down' ) ! (in) call HistoryAddAttr( history = gthist, varname = 'sigm', attrname = 'positive', value = 'down' ) ! (in) call HistoryAddVariable( history = gthist, varname = 'U', dims = StoA('lon', 'lat', 'sig'), longname = 'eastward wind', units = 'm/s', xtype = 'double' ) ! (in) call HistoryAddAttr( history = gthist, varname = 'U', attrname = 'standard_name', value = 'eastward_wind' ) ! (in) call HistoryAddVariable( history = gthist, varname = 'V', dims = StoA('lon', 'lat', 'sig'), longname = 'northward wind', units = 'm/s', xtype = 'double' ) ! (in) call HistoryAddAttr( history = gthist, varname = 'V', attrname = 'standard_name', value = 'northward_wind' ) ! (in) call HistoryAddVariable( history = gthist, varname = 'Temp', dims = StoA('lon', 'lat', 'sig' ), longname = 'temperature', units = 'K', xtype = 'double' ) ! (in) call HistoryAddAttr( history = gthist, varname = 'Temp', attrname = 'standard_name', value = 'air_temperature' ) ! (in) call HistoryAddVariable( history = gthist, varname = 'QVap', dims = StoA('lon', 'lat', 'sig' ), longname = 'specific humidity', units = '1', xtype = 'double' ) ! (in) call HistoryAddAttr( history = gthist, varname = 'QVap', attrname = 'standard_name', value = 'specific_humidity' ) ! (in) call HistoryAddVariable( history = gthist, varname = 'Ps', dims = StoA('lon', 'lat'), longname = 'surface pressure', units = 'Pa', xtype = 'double' ) ! (in) call HistoryAddAttr( history = gthist, varname = 'Ps', attrname = 'standard_name', value = 'surface_air_pressure' ) ! (in) call HistoryPut( history = gthist, varname = 'U', array = xyz_U ) ! (in) call HistoryPut( history = gthist, varname = 'V', array = xyz_V ) ! (in) call HistoryPut( history = gthist, varname = 'Temp', array = xyz_Temp ) ! (in) call HistoryPut( history = gthist, varname = 'QVap', array = xyz_QVap ) ! (in) call HistoryPut( history = gthist, varname = 'Ps', array = xy_Ps ) ! (in) call HistoryClose( history = gthist ) ! (inout) end program phy_ape_test