module wrap_lj
	contains
	
	subroutine L_S2G(s,g)         ! スペクトル→グリッド（ルジャンドル）
		use constants
		implicit none
		real(8) :: s(NN+1)
		real(8) :: g(JM)
		real(8) :: Q((JM*0.5)*5), WS(2*(NN+1))
		call LJTSZG(NM,NN,JM,s,g,LJP,Q,LJR,WS,0)
	endsubroutine
	
	subroutine L_G2S(g,s)          ! グリッド→スペクトル（ルジャンドル）
		use constants
		implicit none
		real(8) :: s(NN+1)
		real(8) :: g(JM)
		real(8) :: Q((JM*0.5)*5), WS(2*(NN+1))
		call LJTGZS(NM,NN,JM,s,g,LJP,Q,LJR,WS,0)
	endsubroutine
	
	subroutine L_S2G_dual(s1,s2,g1,g2)         ! 2変数同時　スペクトル→グリッド（ルジャンドル）
		use constants
		implicit none
		real(8) :: s1(NN+1), s2(NN+1)
		real(8) :: g1(JM), g2(JM)
		real(8) :: Q((JM*0.5)*11), WS1(2*(NN+1)), WS2(2*(NN+1)) 
		call LJMSZG(NM,NN,JM,s1,s2,g1,g2,LJP,Q,LJR,WS1,WS2,0)
	endsubroutine
	
	subroutine L_G2S_dual(g1,g2,s1,s2)         ! ２変数同時　グリッド→スペクトル（ルジャンドル）
		use constants
		implicit none
		real(8) :: s1(NN+1), s2(NN+1)
		real(8) :: g1(JM), g2(JM)
		real(8) :: Q((JM*0.5)*11), WS1(2*(NN+1)), WS2(2*(NN+1)) 
		call LJMGZS(NM,NN,JM,s1,s2,g1,g2,LJP,Q,LJR,WS1,WS2,0)
	endsubroutine
	
	
	subroutine L_S2G_dlat(s,g)          ! 緯度微分　スペクトル→グリッド（ルジャンドル）
		use constants
		implicit none
		real(8) :: s(NN+1), sy(NN+2)
		real(8) :: g(JM)
		real(8) :: Q((JM*0.5)*5), WS(2*(NN+2))
		call LJCSZY(NN, s,sy,LJC)
		call LJTSZG(NM,NN+1,JM,sy,g,LJP,Q,LJR,WS,1)
	endsubroutine
	
	subroutine L_G2S_div(g,s)          !発散 　グリッド→スペクトル (ルジャンドル)
		use constants
		real(8) :: s(NN+1), sy(NN+2)
		real(8) :: g(JM)
		real(8) :: Q((JM*0.5)*5), WS(2*(NN+2))
		call LJTGZS(NM,NN+1,JM,sy,g,LJP,Q,LJR,WS,1)
		call LJCYZS(NN,sy,s,LJC)
	endsubroutine
	
	subroutine L_S2G_dlat_dual(s1,s2,g1,g2)          ! 緯度微分　2変数同時　スペクトル→グリッド（ルジャンドル）
		use constants
		implicit none
		real(8) :: s1(NN+1), s1y(NN+2)
		real(8) :: s2(NN+1), s2y(NN+2)
		real(8) :: g1(JM), g2(JM)
		real(8) :: Q((JM*0.5)*11), WS1(2*(NN+2)), WS2(2*(NN+2)) 
		call LJCSZY(NN, s1,s1y,LJC)
		call LJCSZY(NN, s2,s2y,LJC)
		call LJMSZG(NM,NN+1,JM,s1y,s2y,g1,g2,LJP,Q,LJR,WS1,WS2,1)
	endsubroutine
	
	subroutine L_G2S_div_dual(g1,g2,s1,s2)          !発散緯度成分 　2変数同時　グリッド→スペクトル (ルジャンドル)
		use constants
		real(8) :: s1(NN+1), s1y(NN+2)
		real(8) :: s2(NN+1), s2y(NN+2)
		real(8) :: g1(JM), g2(JM)
		real(8) :: Q((JM*0.5)*11), WS1(2*(NN+2)), WS2(2*(NN+2)) 
		call LJMGZS(NM,NN+1,JM,s1y,s2y,g1,g2,LJP,Q,LJR,WS1,WS2,1)
		call LJCYZS(NN,s1y,s1,LJC)
		call LJCYZS(NN,s2y,s2,LJC)
	endsubroutine
	
	subroutine L_S2S_lap(s1, s2)
		use constants
		real(8) :: s1(NN+1), s2(NN+1)
		integer :: i
		do i = 1, NN+1
			s2(i) = -LJn(i)*(LJn(i)+1.0)*s1(i)
		enddo
	endsubroutine
	
	
endmodule


