!> \file resol_adv_diff_2D-sept2009.f90 !!Resoud l equation adv-diffusion par une methode de relaxation !< !> \namespace reso_adv_diff_2D_vect !! Resoud l equation adv-diffusion par une methode de relaxation !! @note - passage du vecteur et de l epaisseur en dummy !! @note - epaisseur prescrite selon un masque !! @note use module3D_phy !! @todo essayer dans le futur la methode de Richard dUX/dx = H dU/dx + U dH/dx !< module reso_adv_diff_2D_vect use module3D_phy implicit none real :: omega !< parametre schema temporel de la resolution partie diffusion real :: mu_adv !< parametre schema temporel de la resolution advection real :: upwind !< schema spatial pour l'advection ! tableaux de travail. resolution M H = Frelax real,dimension(nx,ny) :: crelax !< diagnonale de M real,dimension(nx,ny) :: arelax !< sous diagonale selon x real,dimension(nx,ny) :: brelax !< sur diagonale selon x real,dimension(nx,ny) :: drelax !< sous diagonale selon y real,dimension(nx,ny) :: erelax !< sur diagonale selon y real,dimension(nx,ny) :: frelax !< vecteur real,dimension(nx,ny) :: c_west !< sur demi mailles Ux real,dimension(nx,ny) :: c_east !< sur demi mailles Ux real,dimension(nx,ny) :: c_north !< sur demi mailles Uy real,dimension(nx,ny) :: c_south !< sur demi mailles Uy real,dimension(nx,ny) :: bdx !< pente socle real,dimension(nx,ny) :: bdy !< pente socle real,dimension(nx,ny) :: hdx !< pente epaisseur real,dimension(nx,ny) :: hdy !< pente epaisseur integer, dimension(2) :: ijmax ! position de maxval integer :: iFAIL contains !> initialise init_reso_adv_diff_2D !! definition des parametres qui gerent la resolution !! @return omega, mu_adv, upwind subroutine init_reso_adv_diff_2D write(num_rep_42,*)'partie diffusive' write(num_rep_42,*)'le type de schema temporel diffusif depend de omega' write(num_rep_42,*)'0 -> explicite, 0.5 -> Crank-Nicolson' write(num_rep_42,*)'1 -> semi implicite, >1 -> over-implicite' ! over implicite propose par Hindmasrsh omega = 2.5 write(num_rep_42,*)'omega = ',omega write(num_rep_42,*) write(num_rep_42,*)'partie advective' write(num_rep_42,*)' le schéma temporel advectif dépend de mu' write(num_rep_42,*)'0 -> explicite, 0.5 -> Crank-Nicolson' write(num_rep_42,*)'1 -> semi implicite, >1 -> over-implicite' mu_adv=1. ! l'over implicite ne s'applique pas a l'equation advective write(num_rep_42,*)'mu_adv = ',mu_adv write(num_rep_42,*)' le schéma spatial dépend de upwind' write(num_rep_42,*)'1 -> schema upwind, 0.5 -> schema centre' upwind=1 write(num_rep_42,*)'upwind = ',upwind write(num_rep_42,*)'------------------------------------------------------' return end subroutine init_reso_adv_diff_2D !------------------------------------------------------------------ !> subroutine resol_adv_diff_2D_Hpresc !! definition des parametres qui gerent la resolution !! @param Dfx,Dfy termes diffusifs !! @param advx,advy termes advectifs !! @param vieuxH ancienne valeur de H !! @param H_presc la valeur H prescrit pour certains noeuds !! @param i_Hpresc le masque ou la valeur de H est prescrite !! @param bil le bilan pour la colonne !! @return newH la valeur de H apres le pas de temps subroutine resol_adv_diff_2D_vect(Dfx,Dfy,advx,advy,H_presc,i_Hpresc,bil,vieuxH,newH) !$ USE OMP_LIB implicit none real,dimension(nx,ny), intent(in) :: Dfx !< terme diffusif selon x real,dimension(nx,ny), intent(in) :: Dfy !< terme diffusif selon y real,dimension(nx,ny), intent(in) :: Advx !< terme advectif selon x real,dimension(nx,ny), intent(in) :: Advy !< terme advectif selon y real,dimension(nx,ny), intent(in) :: vieuxH !< ancienne valeur de H real,dimension(nx,ny), intent(out):: newH !< nouvelle valeur de H real,dimension(nx,ny), intent(in) :: bil !< bilan de masse pour la colonne real,dimension(nx,ny), intent(in) :: H_presc !< H value if prescribed integer,dimension(nx,ny), intent(in) :: i_Hpresc !< 1 if H is prescribed on this node, else 0 ! tableaux de travail. resolution M H = Frelax !!$real,dimension(nx,ny) :: crelax !< diagnonale de M !!$real,dimension(nx,ny) :: arelax !< sous diagonale selon x !!$real,dimension(nx,ny) :: brelax !< sur diagonale selon x !!$real,dimension(nx,ny) :: drelax !< sous diagonale selon y !!$real,dimension(nx,ny) :: erelax !< sur diagonale selon y !!$real,dimension(nx,ny) :: frelax !< vecteur !!$real,dimension(nx,ny) :: c_west !< sur demi mailles Ux !!$real,dimension(nx,ny) :: c_east !< sur demi mailles Ux !!$real,dimension(nx,ny) :: c_north !< sur demi mailles Uy !!$real,dimension(nx,ny) :: c_south !