MODULE caldyn_wave_mod CONTAINS SUBROUTINE allocate_caldyn IMPLICIT NONE END SUBROUTINE allocate_caldyn SUBROUTINE swap_caldyn(ind) IMPLICIT NONE INTEGER,INTENT(IN) :: ind END SUBROUTINE swap_caldyn SUBROUTINE init_wave(hi,ue) USE icosa IMPLICIT NONE REAL(rstd),INTENT(OUT) :: hi(iim*jjm) REAL(rstd),INTENT(OUT) :: ue(iim*3*jjm) REAL(rstd) :: lon, lat,X0(3) INTEGER :: i,j,n lon=Pi/4 lat=Pi/2-Pi/8 CALL lonlat2xyz(lon,lat,X0) DO j=jj_begin,jj_end DO i=ii_begin,ii_end n=(j-1)*iim+i hi(n)=exp(-128.*sum((xyz_i(n,:)-X0(:))**2)) ue(n+u_right)=0 ue(n+u_lup)=0 ue(n+u_ldown)=0 ENDDO ENDDO END SUBROUTINE init_wave SUBROUTINE caldyn(f_h, f_u, f_dh, f_du) USE icosa IMPLICIT NONE TYPE(t_field),POINTER :: f_h(:) TYPE(t_field),POINTER :: f_u(:) TYPE(t_field),POINTER :: f_dh(:) TYPE(t_field),POINTER :: f_du(:) REAL(rstd),POINTER :: h(:) REAL(rstd),POINTER :: u(:) REAL(rstd),POINTER :: dh(:) REAL(rstd),POINTER :: du(:) INTEGER :: ind INTEGER,SAVE :: it=0 CALL transfert_request(f_h,req_i1) CALL transfert_request(f_u,req_e1) CALL transfert_request(f_u,req_e1) DO ind=1,ndomain CALL swap_dimensions(ind) CALL swap_geometry(ind) CALL swap_caldyn(ind) h=f_h(ind) u=f_u(ind) dh=f_dh(ind) du=f_du(ind) CALL compute_caldyn(h, u, dh, du) ENDDO IF (mod(it,240)==0) THEN CALL writefield("h",f_h) CALL writefield("dh",f_dh) CALL Compute_enstrophy ENDIF it=it+1 END SUBROUTINE caldyn SUBROUTINE compute_caldyn(hi,ue,dhi,due) USE icosa IMPLICIT NONE REAL(rstd),INTENT(IN) :: hi(iim*jjm) REAL(rstd),INTENT(IN) :: ue(iim*3*jjm) REAL(rstd),INTENT(OUT) :: dhi(iim*jjm) REAL(rstd),INTENT(OUT) :: due(iim*3*jjm) INTEGER :: i,j,n DO j=jj_begin,jj_end DO i=ii_begin,ii_end n=(j-1)*iim+i dhi(n)=-1./Ai(n)*(ne(n,right)*ue(n+u_right)*le(n+u_right) + & ne(n,rup)*ue(n+u_rup)*le(n+u_rup) + & ne(n,lup)*ue(n+u_lup)*le(n+u_lup) + & ne(n,left)*ue(n+u_left)*le(n+u_left) + & ne(n,ldown)*ue(n+u_ldown)*le(n+u_ldown) + & ne(n,rdown)*ue(n+u_rdown)*le(n+u_rdown)) ENDDO ENDDO DO j=jj_begin,jj_end DO i=ii_begin,ii_end n=(j-1)*iim+i due(n+u_right)=1/de(n+u_right)*(ne(n,right)*hi(n)+ ne(n+t_right,left)*hi(n+t_right) ) due(n+u_lup)=1/de(n+u_lup)*(ne(n,lup)*hi(n)+ ne(n+t_lup,rdown)*hi(n+t_lup )) due(n+u_ldown)=1/de(n+u_ldown)*(ne(n,ldown)*hi(n)+ne(n+t_ldown,rup)*hi(n+t_ldown) ) ENDDO ENDDO END SUBROUTINE compute_caldyn END MODULE caldyn_wave_mod