// File: jamesliu516[P]amrdg2d/roe.cpp
// Function: RoeRiemannSolver(privariables*, privariables*, privariables*, double*)
void RoeRiemannSolver(JBBL *Ul, JBBL *Ur, JBBL *Uface, double *a) 
{
	double ql,qr;

	double htl, htr,faceht;
	double dls;

	ql=sqrt(Ul->q);
	qr=sqrt(Ur->q);

 
	Uface->q = ql*qr;

	Uface->u=(ql*Ul->u + qr*Ur->u)/(ql+qr);
	Uface->v=(ql*Ul->v + qr*Ur->v)/(ql+qr);

        htl=Ul->p/(Ul->q * (GAMMA-1)) 
		+ 0.5 * (Ul->u * Ul->u + Ul->v * Ul->v)
		+ Ul->p/Ul->q;
        htr=Ur->p/(Ur->q * (GAMMA-1)) 
		+ 0.5 * (Ur->u * Ur->u + Ur->v * Ur->v)
		+ Ur->p/Ur->q;

	faceht=(ql*htl + qr*htr)/(ql+qr);

       htl=(faceht - 0.5 * (Uface->u*Uface->u +
		Uface->v*Uface->v)) * (GAMMA-1);

	Uface->p = Uface->q * htl  / GAMMA;
	*a=sqrt(htl);  // ����
}

// Assembly:
subq $0x58, %rsp
movq %rdi, 0x50(%rsp)
movq %rsi, 0x48(%rsp)
movq %rdx, 0x40(%rsp)
movq %rcx, 0x38(%rsp)
movq 0x50(%rsp), %rax
movsd (%rax), %xmm0
callq 0x31c0
movsd %xmm0, 0x30(%rsp)
movq 0x48(%rsp), %rax
movsd (%rax), %xmm0
callq 0x31c0
movsd %xmm0, 0x28(%rsp)
movsd 0x30(%rsp), %xmm0
mulsd 0x28(%rsp), %xmm0
movq 0x40(%rsp), %rax
movsd %xmm0, (%rax)
movsd 0x30(%rsp), %xmm0
movq 0x50(%rsp), %rax
movsd 0x8(%rax), %xmm2
movsd 0x28(%rsp), %xmm1
movq 0x48(%rsp), %rax
mulsd 0x8(%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd 0x30(%rsp), %xmm1
addsd 0x28(%rsp), %xmm1
divsd %xmm1, %xmm0
movq 0x40(%rsp), %rax
movsd %xmm0, 0x8(%rax)
movsd 0x30(%rsp), %xmm0
movq 0x50(%rsp), %rax
movsd 0x10(%rax), %xmm2
movsd 0x28(%rsp), %xmm1
movq 0x48(%rsp), %rax
mulsd 0x10(%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd 0x30(%rsp), %xmm1
addsd 0x28(%rsp), %xmm1
divsd %xmm1, %xmm0
movq 0x40(%rsp), %rax
movsd %xmm0, 0x10(%rax)
movq 0x50(%rsp), %rax
movsd 0x18(%rax), %xmm1
movq 0x50(%rsp), %rax
movsd 0x1bac8(%rip), %xmm0    # 0x3f1e8
mulsd (%rax), %xmm0
divsd %xmm0, %xmm1
movq 0x50(%rsp), %rax
movsd 0x8(%rax), %xmm0
movq 0x50(%rsp), %rax
movsd 0x8(%rax), %xmm3
movq 0x50(%rsp), %rax
movsd 0x10(%rax), %xmm2
movq 0x50(%rsp), %rax
mulsd 0x10(%rax), %xmm2
mulsd %xmm3, %xmm0
addsd %xmm2, %xmm0
movsd 0x1b9e0(%rip), %xmm2    # 0x3f140
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movq 0x50(%rsp), %rax
movsd 0x18(%rax), %xmm1
movq 0x50(%rsp), %rax
divsd (%rax), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, 0x20(%rsp)
movq 0x48(%rsp), %rax
movsd 0x18(%rax), %xmm1
movq 0x48(%rsp), %rax
movsd 0x1ba4c(%rip), %xmm0    # 0x3f1e8
mulsd (%rax), %xmm0
divsd %xmm0, %xmm1
movq 0x48(%rsp), %rax
movsd 0x8(%rax), %xmm0
movq 0x48(%rsp), %rax
movsd 0x8(%rax), %xmm3
movq 0x48(%rsp), %rax
movsd 0x10(%rax), %xmm2
movq 0x48(%rsp), %rax
mulsd 0x10(%rax), %xmm2
mulsd %xmm3, %xmm0
addsd %xmm2, %xmm0
movsd 0x1b964(%rip), %xmm2    # 0x3f140
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movq 0x48(%rsp), %rax
movsd 0x18(%rax), %xmm1
movq 0x48(%rsp), %rax
divsd (%rax), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, 0x18(%rsp)
movsd 0x30(%rsp), %xmm0
movsd 0x20(%rsp), %xmm2
movsd 0x28(%rsp), %xmm1
mulsd 0x18(%rsp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd 0x30(%rsp), %xmm1
addsd 0x28(%rsp), %xmm1
divsd %xmm1, %xmm0
movsd %xmm0, 0x10(%rsp)
movsd 0x10(%rsp), %xmm1
movq 0x40(%rsp), %rax
movsd 0x8(%rax), %xmm0
movq 0x40(%rsp), %rax
movsd 0x8(%rax), %xmm3
movq 0x40(%rsp), %rax
movsd 0x10(%rax), %xmm2
movq 0x40(%rsp), %rax
mulsd 0x10(%rax), %xmm2
mulsd %xmm3, %xmm0
addsd %xmm2, %xmm0
movsd 0x1b8c3(%rip), %xmm2    # 0x3f138
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd 0x1b963(%rip), %xmm1    # 0x3f1e8
mulsd %xmm1, %xmm0
movsd %xmm0, 0x20(%rsp)
movq 0x40(%rsp), %rax
movsd (%rax), %xmm0
mulsd 0x20(%rsp), %xmm0
movsd 0x1b932(%rip), %xmm1    # 0x3f1d8
divsd %xmm1, %xmm0
movq 0x40(%rsp), %rax
movsd %xmm0, 0x18(%rax)
movsd 0x20(%rsp), %xmm0
callq 0x31c0
movq 0x38(%rsp), %rax
movsd %xmm0, (%rax)
addq $0x58, %rsp
retq
nopl (%rax)