// File: /workspace/github_cpp_makefile_star2_O3/JRLamontagne[P]cdice_sa/CDICE_doeclim.cpp
// Function: doeclim_init(double, double, int, int, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*)
void doeclim_init(double t2co, double kappa, int dt, int ns, 
		  double *flnd, double *powtoheat, double *cal, double *cas, double *taucfl,
		  double *taukls, double *taucfs, double *tauksl, double *bsi, 
		  double *IB, double *A, double *fso, double *taudif, double *Ker)
{
  
  // Define and initialize parameters
  double pi = 3.141592653589793;
  double B[4] = {0.0, 0.0, 0.0, 0.0};
  double C[4] = {0.0, 0.0, 0.0, 0.0};
  double KT0[ns];
  double KTA1[ns];
  double KTB1[ns];
  double KTA2[ns];
  double KTB2[ns];
  double KTA3[ns];
  double KTB3[ns];

  for(int i=0; i<ns; i++) {
    KT0[i] = 0.0;
    KTA1[i] = 0.0;
    KTB1[i] = 0.0;
    KTA2[i] = 0.0;
    KTB2[i] = 0.0;
    KTA3[i] = 0.0;
    KTB3[i] = 0.0;
  }

  // Define the doeclim parameters
  double ak = 0.31;
  double bk = 1.59;
  double csw = 0.13;
  double earth_area = 5100656 * pow(10.0, 8);
  double kcon = 3155.0;
  double q2co = 3.7; 
  double rlam = 1.43;
  double secs_per_Year = 31556926.0;
  double zbot = 4000.0;
  *bsi = 1.3;
  *cal = 0.52;
  *cas = 7.80;
  *flnd = 0.29;
  *fso = 0.95;
  
  // Dependent Model Parameters
  double ocean_area = (1.0 - *flnd) * earth_area;
  double cnum = rlam * *flnd + *bsi * (1.0 - *flnd);
  double cden = rlam * *flnd - ak * (rlam - *bsi);
  double cfl = *flnd * cnum / cden * q2co / t2co - bk * (rlam - *bsi) / cden;
  double cfs = (rlam * *flnd - ak / (1.0 - *flnd) * (rlam - *bsi)) * cnum / cden * q2co / t2co + rlam * *flnd / (1.0 - *flnd) * bk * (rlam - *bsi) / cden;
  double kls = bk * rlam * *flnd / cden - ak * *flnd * cnum / cden * q2co / t2co; 
  double keff = kcon * kappa;
  double taubot = pow(zbot,2) / keff;
  *powtoheat = ocean_area * secs_per_Year / pow(10.0,22);
  *taucfs = *cas / cfs;
  *taucfl = *cal / cfl;
  *taudif = pow(*cas,2) / pow(csw,2) * pi / keff;
  *tauksl  = (1.0 - *flnd) * *cas / kls;
  *taukls  = *flnd * *cal / kls;
  
  // First order
  KT0[ns-1] = 4.0 - 2.0 * pow(2.0, 0.5);
  KTA1[ns-1] = -8.0 * exp(-taubot / double(dt)) + 4.0 * pow(2.0, 0.5) * exp(-0.5 * taubot / double(dt));
  KTB1[ns-1] = 4.0 * pow((pi * taubot / double(dt)), 0.5) * (1.0 + erf(pow(0.5 * taubot / double(dt), 0.5)) - 2.0 * erf(pow(taubot / double(dt), 0.5)));

  // Second order
  KTA2[ns-1] =  8.0 * exp(-4.0 * taubot / double(dt)) - 4.0 * pow(2.0, 0.5) * exp(-2.0 * taubot / double(dt));
  KTB2[ns-1] = -8.0 * pow((pi * taubot / double(dt)), 0.5) * (1.0 + erf(pow((2.0 * taubot / double(dt)), 0.5)) - 2.0 * erf(2.0 * pow((taubot / double(dt)), 0.5)) );

  // Third order
  KTA3[ns-1] = -8.0 * exp(-9.0 * taubot / double(dt)) + 4.0 * pow(2.0, 0.5) * exp(-4.5 * taubot / double(dt));
  KTB3[ns-1] = 12.0 * pow((pi * taubot / double(dt)), 0.5) * (1.0 + erf(pow((4.5 * taubot / double(dt)), 0.5)) - 2.0 * erf(3.0 * pow((taubot / double(dt)), 0.5)) );

  // Calculate the kernel component vectors
  for(int i=0; i<(ns-1); i++) {
    
    // First order
    KT0[i] = 4.0 * pow((double(ns-i)), 0.5) - 2.0 * pow((double(ns+1-i)), 0.5) - 2.0 * pow(double(ns-1-i), 0.5);      
    KTA1[i] = -8.0 * pow(double(ns-i), 0.5) * exp(-taubot / double(dt) / double(ns-i)) + 4.0 * pow(double(ns+1-i), 0.5) * exp(-taubot / double(dt) / double(ns+1-i)) + 4.0 * pow(double(ns-1-i), 0.5) * exp(-taubot/double(dt) / double(ns-1-i));
    KTB1[i] =  4.0 * pow((pi * taubot / double(dt)), 0.5) * ( erf(pow((taubot / double(dt) / double(ns-1-i)), 0.5)) + erf(pow((taubot / double(dt) / double(ns+1-i)), 0.5)) - 2.0 * erf(pow((taubot / double(dt) / double(ns-i)), 0.5)) );

    // Second order
    KTA2[i] =  8.0 * pow(double(ns-i), 0.5) * exp(-4.0 * taubot / double(dt) / double(ns-i)) - 4.0 * pow(double(ns+1-i), 0.5) * exp(-4.0 * taubot / double(dt) / double(ns+1-i)) - 4.0 * pow(double(ns-1-i), 0.5) * exp(-4.0 * taubot / double(dt) / double(ns-1-i));
    KTB2[i] = -8.0 * pow((pi * taubot / double(dt)), 0.5) * ( erf(2.0 * pow((taubot / double(dt) / double(ns-1-i)), 0.5)) + erf(2.0 * pow((taubot / double(dt) / double(ns+1-i)), 0.5)) - 2.0 * erf(2.0 * pow((taubot / double(dt) / double(ns-i)), 0.5)) );

    // Third order
    KTA3[i] = -8.0 * pow(double(ns-i), 0.5) * exp(-9.0 * taubot / double(dt) / double(ns-i)) + 4.0 * pow(double(ns+1-i), 0.5) * exp(-9.0 * taubot / double(dt) / double(ns+1-i)) + 4.0 * pow(double(ns-1-i), 0.5) * exp(-9.0 * taubot / double(dt) / double(ns-1-i)); 
    KTB3[i] = 12.0 * pow((pi * taubot / double(dt)), 0.5) * ( erf(3.0 * pow((taubot / double(dt) / double(ns-1-i)), 0.5)) + erf(3.0 * pow((taubot / double(dt) / double(ns+1-i)), 0.5)) - 2.0 * erf(3.0 * pow((taubot / double(dt) / double(ns-i)), 0.5)) );

  }

  // Sum up the kernel components
  for(int i=0; i<ns; i++) {
    
    Ker[i] = KT0[i] + KTA1[i] + KTB1[i] + KTA2[i] + KTB2[i] + KTA3[i] + KTB3[i];

  }

  // Switched on (To switch off, comment out lines below)
  C[0] = 1.0 / pow(*taucfl, 2.0) + 1.0 / pow(*taukls, 2.0) + 2.0 / *taucfl / *taukls + *bsi / *taukls / *tauksl;
  C[1] = -1 * *bsi / pow(*taukls, 2.0) - *bsi / *taucfl / *taukls - *bsi / *taucfs / *taukls - pow(*bsi, 2.0) / *taukls / *tauksl;
  C[2] = -1 * *bsi / pow(*tauksl, 2.0) - 1.0 / *taucfs / *tauksl - 1.0 / *taucfl / *tauksl -1.0 / *taukls / *tauksl;
  C[3] = 1.0 / pow(*taucfs, 2.0) + pow(*bsi, 2.0) / pow(*tauksl, 2.0) + 2.0 * *bsi / *taucfs / *tauksl + *bsi / *taukls / *tauksl;
  for(int i=0; i<4; i++) {
    C[i] = C[i] * (pow(double(dt), 2.0) / 12.0);
  }

  //------------------------------------------------------------------
  // Matrices of difference equation system B*T(i+1) = Q(i) + A*T(i)
  // T = (TL,TO)
  // (Equation A.27, EK05, or Equations 2.3.24 and 2.3.27, TK07)
  B[0] = 1.0 + double(dt) / (2.0 * *taucfl) + double(dt) / (2.0 * *taukls);
  B[1] = double(-dt) / (2.0 * *taukls) * *bsi;
  B[2] = double(-dt) / (2.0 * *tauksl);
  B[3] = 1.0 + double(dt) / (2.0 * *taucfs) + double(dt) / (2.0 * *tauksl) * *bsi + 2.0 * *fso * pow((double(dt) / *taudif), 0.5);

  A[0] = 1.0 - double(dt) / (2.0 * *taucfl) - double(dt) / (2.0 * *taukls);
  A[1] = double(dt) / (2.0 * *taukls) * *bsi;
  A[2] = double(dt) / (2.0 * *tauksl);
  A[3] = 1.0 - double(dt) / (2.0 * *taucfs) - double(dt) / (2.0 * *tauksl) * *bsi + Ker[ns-1] * *fso * pow((double(dt) / *taudif), 0.5);

  for (int i=0; i<4; i++) {
    B[i] = B[i] + C[i];
    A[i] = A[i] + C[i];
  }

  // Calculate the inverse of B
  invert_1d_2x2_matrix(B, IB);

  return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x198, %rsp            # imm = 0x198
movq %rcx, %r13
movq %rdx, %r10
movl %edi, -0xac(%rbp)
movq %rsp, -0x1a0(%rbp)
movq 0x50(%rbp), %r11
xorps %xmm2, %xmm2
movaps %xmm2, -0x180(%rbp)
movaps %xmm2, -0x190(%rbp)
movaps %xmm2, -0x160(%rbp)
movaps %xmm2, -0x170(%rbp)
movl %esi, %ebx
movq %rsp, %rdi
leaq 0xf(,%rbx,8), %rax
andq $-0x10, %rax
subq %rax, %rdi
movq %rdi, %rsp
movq %rsp, %rcx
subq %rax, %rcx
movq %rcx, -0xc8(%rbp)
movq %rcx, %rsp
movq %rsp, %rcx
subq %rax, %rcx
movq %rcx, -0xc0(%rbp)
movq %rcx, %rsp
movq %rsp, %rcx
subq %rax, %rcx
movq %rcx, -0xb8(%rbp)
movq %rcx, %rsp
movq %rsp, %r14
subq %rax, %r14
movq %r14, %rsp
movq %rsp, %r15
subq %rax, %r15
movq %r15, %rsp
movq %rsp, %r12
subq %rax, %r12
movq %r12, %rsp
movl %esi, -0x74(%rbp)
testl %esi, %esi
movq %rdi, -0xa8(%rbp)
jle 0x63f8
movq %r13, -0xf0(%rbp)
leaq (,%rbx,8), %r13
movq -0xa8(%rbp), %rdi
xorl %esi, %esi
movq %r13, %rdx
movq %r8, -0x50(%rbp)
movq %r10, -0x40(%rbp)
movsd %xmm1, -0x70(%rbp)
movq %r9, -0x60(%rbp)
movaps %xmm0, -0x100(%rbp)
callq 0x20e0
movq -0xc8(%rbp), %rdi
xorl %esi, %esi
movq %r13, %rdx
callq 0x20e0
movq -0xc0(%rbp), %rdi
xorl %esi, %esi
movq %r13, %rdx
callq 0x20e0
movq -0xb8(%rbp), %rdi
xorl %esi, %esi
movq %r13, %rdx
callq 0x20e0
movq %r14, %rdi
xorl %esi, %esi
movq %r13, %rdx
callq 0x20e0
movq %r15, %rdi
xorl %esi, %esi
movq %r13, %rdx
callq 0x20e0
movq %r12, %rdi
xorl %esi, %esi
movq %r13, %rdx
movq -0xf0(%rbp), %r13
callq 0x20e0
movapd -0x100(%rbp), %xmm0
movq 0x50(%rbp), %r11
movq -0x60(%rbp), %r9
movsd -0x70(%rbp), %xmm1
movq -0x40(%rbp), %r10
movq -0x50(%rbp), %r8
movq -0xa8(%rbp), %rdi
movq %rbx, -0x198(%rbp)
movabsq $0x3ff4cccccccccccd, %rax # imm = 0x3FF4CCCCCCCCCCCD
movq 0x30(%rbp), %rdx
movq %rax, (%rdx)
movabsq $0x3fe0a3d70a3d70a4, %rax # imm = 0x3FE0A3D70A3D70A4
movq %rax, (%r8)
movabsq $0x401f333333333333, %rax # imm = 0x401F333333333333
movq %rax, (%r9)
movabsq $0x3fd28f5c28f5c28f, %rax # imm = 0x3FD28F5C28F5C28F
movq %rax, (%r10)
movabsq $0x3fee666666666666, %rax # imm = 0x3FEE666666666666
movq 0x48(%rbp), %rcx
movq %rax, (%rcx)
movsd (%r10), %xmm8
movsd (%rdx), %xmm5
movapd %xmm8, %xmm2
unpcklpd %xmm5, %xmm2            # xmm2 = xmm2[0],xmm5[0]
movapd 0x1dce(%rip), %xmm3     # 0x8230
subpd %xmm2, %xmm3
movsd 0x1cf2(%rip), %xmm6     # 0x8160
mulsd %xmm3, %xmm6
movapd %xmm3, %xmm7
unpckhpd %xmm3, %xmm7            # xmm7 = xmm7[1],xmm3[1]
movsd 0x1ce6(%rip), %xmm2     # 0x8168
mulsd %xmm2, %xmm7
movsd 0x1ce2(%rip), %xmm4     # 0x8170
mulsd %xmm8, %xmm4
addsd %xmm4, %xmm7
divsd %xmm3, %xmm2
unpcklpd %xmm2, %xmm5            # xmm5 = xmm5[0],xmm2[0]
mulpd %xmm3, %xmm5
movapd %xmm4, %xmm2
unpcklpd %xmm4, %xmm2            # xmm2 = xmm2[0],xmm4[0]
addpd %xmm5, %xmm2
movapd %xmm8, %xmm5
mulsd %xmm2, %xmm5
divsd %xmm7, %xmm5
shufpd $0x2, %xmm3, %xmm5      # xmm5 = xmm5[0],xmm3[1]
mulpd 0x1d77(%rip), %xmm5     # 0x8240
mulsd 0x1cc7(%rip), %xmm6     # 0x8198
divsd 0x1cc7(%rip), %xmm6     # 0x81a0
movsd %xmm6, (%r13)
movapd %xmm0, %xmm6
unpcklpd %xmm7, %xmm6            # xmm6 = xmm6[0],xmm7[0]
divpd %xmm6, %xmm5
movapd %xmm5, %xmm6
unpckhpd %xmm5, %xmm6            # xmm6 = xmm6[1],xmm5[1]
subsd %xmm6, %xmm5
movapd %xmm2, %xmm6
unpckhpd %xmm2, %xmm6            # xmm6 = xmm6[1],xmm2[1]
mulsd %xmm2, %xmm6
divsd %xmm7, %xmm6
divsd %xmm3, %xmm4
mulsd 0x1c65(%rip), %xmm4     # 0x8178
unpckhpd 0x1d35(%rip), %xmm3     # xmm3 = xmm3[1],mem[1]
unpcklpd %xmm6, %xmm4            # xmm4 = xmm4[0],xmm6[0]
mulpd %xmm4, %xmm3
movapd %xmm7, %xmm4
unpcklpd %xmm0, %xmm4            # xmm4 = xmm4[0],xmm0[0]
divpd %xmm4, %xmm3
movapd %xmm3, %xmm6
unpckhpd %xmm3, %xmm6            # xmm6 = xmm6[1],xmm3[1]
addsd %xmm3, %xmm6
mulsd 0x1c45(%rip), %xmm1     # 0x8188
movsd (%r9), %xmm3
divsd %xmm6, %xmm3
movq 0x20(%rbp), %rax
movsd %xmm3, (%rax)
movsd (%r8), %xmm3
divsd %xmm5, %xmm3
movq 0x10(%rbp), %rax
movsd %xmm3, (%rax)
movsd (%r9), %xmm3
mulsd %xmm3, %xmm3
divsd 0x1c32(%rip), %xmm3     # 0x81a8
mulsd 0x1c32(%rip), %xmm3     # 0x81b0
divsd %xmm1, %xmm3
movsd %xmm3, (%r11)
movsd 0x1a79(%rip), %xmm3     # 0x8008
subsd (%r10), %xmm3
mulsd (%r9), %xmm3
movsd 0x1bdf(%rip), %xmm5     # 0x8180
mulsd %xmm8, %xmm5
mulsd %xmm2, %xmm5
divsd %xmm7, %xmm5
unpcklpd %xmm5, %xmm8            # xmm8 = xmm8[0],xmm5[0]
mulpd 0x1ca4(%rip), %xmm8     # 0x8260
divpd %xmm4, %xmm8
movapd %xmm8, %xmm2
unpckhpd %xmm8, %xmm2            # xmm2 = xmm2[1],xmm8[1]
subsd %xmm2, %xmm8
movsd 0x1bb8(%rip), %xmm0     # 0x8190
divsd %xmm8, %xmm3
movq 0x28(%rbp), %rax
movsd %xmm3, (%rax)
movsd (%r10), %xmm2
mulsd (%r8), %xmm2
movapd %xmm0, %xmm3
divsd %xmm1, %xmm3
movapd %xmm3, -0x50(%rbp)
divsd %xmm8, %xmm2
movq 0x18(%rbp), %rax
movsd %xmm2, (%rax)
movl -0x74(%rbp), %r13d
movslq %r13d, %rbx
movabsq $0x3ff2bec333018866, %rax # imm = 0x3FF2BEC333018866
movq %rax, -0x8(%rdi,%rbx,8)
leaq -0x1(%rbx), %rax
movq %rax, -0x128(%rbp)
movapd 0x1b0e(%rip), %xmm0     # 0x8140
xorpd %xmm3, %xmm0
xorps %xmm1, %xmm1
cvtsi2sdl -0xac(%rbp), %xmm1
movapd %xmm1, -0x90(%rbp)
divsd %xmm1, %xmm0
movapd %xmm0, -0x150(%rbp)
callq 0x2360
movsd %xmm0, -0x40(%rbp)
movsd 0x1b51(%rip), %xmm0     # 0x81b8
mulsd -0x50(%rbp), %xmm0
divsd -0x90(%rbp), %xmm0
callq 0x2360
mulsd 0x1b3f(%rip), %xmm0     # 0x81c0
movsd -0x40(%rbp), %xmm1
mulsd 0x1b3a(%rip), %xmm1     # 0x81c8
addsd %xmm0, %xmm1
movq -0xc8(%rbp), %rax
movsd %xmm1, -0x8(%rax,%rbx,8)
movsd 0x1b09(%rip), %xmm0     # 0x81b0
mulsd -0x50(%rbp), %xmm0
divsd -0x90(%rbp), %xmm0
movsd %xmm0, -0x100(%rbp)
movsd 0x1a94(%rip), %xmm1     # 0x8158
callq 0x2340
mulsd 0x1aff(%rip), %xmm0     # 0x81d0
movsd %xmm0, -0x40(%rbp)
movapd -0x50(%rbp), %xmm0
movsd 0x1a75(%rip), %xmm1     # 0x8158
mulsd %xmm1, %xmm0
divsd -0x90(%rbp), %xmm0
callq 0x2340
callq 0x2250
movapd %xmm0, %xmm1
movsd 0x1903(%rip), %xmm0     # 0x8008
addsd %xmm0, %xmm1
movsd %xmm1, -0x70(%rbp)
movapd -0x50(%rbp), %xmm0
divsd -0x90(%rbp), %xmm0
movapd %xmm0, -0xf0(%rbp)
movsd 0x1a2d(%rip), %xmm1     # 0x8158
callq 0x2340
callq 0x2250
addsd %xmm0, %xmm0
movsd -0x70(%rbp), %xmm1
subsd %xmm0, %xmm1
mulsd -0x40(%rbp), %xmm1
movq -0xc0(%rbp), %rax
movsd %xmm1, -0x8(%rax,%rbx,8)
movsd 0x1a7c(%rip), %xmm0     # 0x81d8
mulsd -0x50(%rbp), %xmm0
divsd -0x90(%rbp), %xmm0
movsd %xmm0, -0x110(%rbp)
callq 0x2360
movsd %xmm0, -0x40(%rbp)
movsd 0x1a5d(%rip), %xmm0     # 0x81e0
mulsd -0x50(%rbp), %xmm0
divsd -0x90(%rbp), %xmm0
callq 0x2360
mulsd 0x1a4b(%rip), %xmm0     # 0x81e8
movsd -0x40(%rbp), %xmm1
mulsd 0x1a46(%rip), %xmm1     # 0x81f0
addsd %xmm0, %xmm1
movq -0xb8(%rbp), %rax
movsd %xmm1, -0x8(%rax,%rbx,8)
movsd -0x100(%rbp), %xmm0
movsd 0x198d(%rip), %xmm1     # 0x8158
callq 0x2340
mulsd 0x19f0(%rip), %xmm0     # 0x81c8
movsd %xmm0, -0x40(%rbp)
movapd -0x50(%rbp), %xmm0
addsd %xmm0, %xmm0
divsd -0x90(%rbp), %xmm0
movsd 0x1962(%rip), %xmm1     # 0x8158
callq 0x2340
callq 0x2250
movapd %xmm0, %xmm1
movsd 0x17fc(%rip), %xmm0     # 0x8008
addsd %xmm0, %xmm1
movsd %xmm1, -0x70(%rbp)
movapd -0xf0(%rbp), %xmm0
movsd 0x1933(%rip), %xmm1     # 0x8158
callq 0x2340
addsd %xmm0, %xmm0
callq 0x2250
addsd %xmm0, %xmm0
movsd -0x70(%rbp), %xmm1
subsd %xmm0, %xmm1
mulsd -0x40(%rbp), %xmm1
movsd %xmm1, -0x8(%r14,%rbx,8)
movsd 0x19a4(%rip), %xmm0     # 0x81f8
mulsd -0x50(%rbp), %xmm0
divsd -0x90(%rbp), %xmm0
movsd %xmm0, -0x108(%rbp)
callq 0x2360
movsd %xmm0, -0x40(%rbp)
movsd 0x1985(%rip), %xmm0     # 0x8200
mulsd -0x50(%rbp), %xmm0
divsd -0x90(%rbp), %xmm0
callq 0x2360
mulsd 0x192b(%rip), %xmm0     # 0x81c0
movsd -0x40(%rbp), %xmm1
mulsd 0x1926(%rip), %xmm1     # 0x81c8
addsd %xmm0, %xmm1
movsd %xmm1, -0x8(%r15,%rbx,8)
movsd -0x100(%rbp), %xmm0
movsd 0x189b(%rip), %xmm1     # 0x8158
callq 0x2340
mulsd 0x1886(%rip), %xmm0     # 0x8150
movsd %xmm0, -0x40(%rbp)
movapd -0x50(%rbp), %xmm0
mulsd 0x192c(%rip), %xmm0     # 0x8208
divsd -0x90(%rbp), %xmm0
movsd 0x186c(%rip), %xmm1     # 0x8158
callq 0x2340
callq 0x2250
movapd %xmm0, %xmm1
movsd 0x1706(%rip), %xmm0     # 0x8008
addsd %xmm0, %xmm1
movsd %xmm1, -0x50(%rbp)
movapd -0xf0(%rbp), %xmm0
movsd 0x183d(%rip), %xmm1     # 0x8158
callq 0x2340
mulsd 0x18e8(%rip), %xmm0     # 0x8210
callq 0x2250
addsd %xmm0, %xmm0
movsd -0x50(%rbp), %xmm1
subsd %xmm0, %xmm1
mulsd -0x40(%rbp), %xmm1
movsd %xmm1, -0x8(%r12,%rbx,8)
cmpl $0x2, %r13d
jl 0x7021
movl -0x128(%rbp), %eax
shlq $0x3, %rax
movq %rax, -0x1a8(%rbp)
xorl %r13d, %r13d
movl -0x74(%rbp), %eax
movl %eax, %ebx
xorps %xmm0, %xmm0
cvtsi2sd %ebx, %xmm0
ucomisd 0x18a0(%rip), %xmm0     # 0x8218
movsd %xmm0, -0x70(%rbp)
jb 0x6988
xorps %xmm2, %xmm2
sqrtsd %xmm0, %xmm2
jmp 0x6991
callq 0x2160
movapd %xmm0, %xmm2
leal 0x1(%rbx), %eax
xorps %xmm0, %xmm0
cvtsi2sd %eax, %xmm0
ucomisd 0x1875(%rip), %xmm0     # 0x8218
movsd %xmm0, -0x40(%rbp)
jb 0x69b3
xorps %xmm3, %xmm3
sqrtsd %xmm0, %xmm3
jmp 0x69c6
movapd %xmm2, -0x60(%rbp)
callq 0x2160
movapd -0x60(%rbp), %xmm2
movapd %xmm0, %xmm3
andpd 0x18a2(%rip), %xmm2     # 0x8270
mulsd 0x17fa(%rip), %xmm2     # 0x81d0
decl %ebx
xorps %xmm0, %xmm0
cvtsi2sd %ebx, %xmm0
ucomisd 0x1831(%rip), %xmm0     # 0x8218
movsd %xmm0, -0x50(%rbp)
jb 0x69f4
sqrtsd %xmm0, %xmm0
jmp 0x6a13
movapd %xmm2, -0x60(%rbp)
movapd %xmm3, -0xe0(%rbp)
callq 0x2160
movapd -0xe0(%rbp), %xmm3
movapd -0x60(%rbp), %xmm2
movq -0xa8(%rbp), %rax
movapd 0x184e(%rip), %xmm1     # 0x8270
andpd %xmm1, %xmm3
addsd %xmm3, %xmm3
subsd %xmm3, %xmm2
andpd %xmm1, %xmm0
addsd %xmm0, %xmm0
subsd %xmm0, %xmm2
movsd %xmm2, (%rax,%r13)
movsd -0x70(%rbp), %xmm1
ucomisd 0x17cb(%rip), %xmm1     # 0x8218
jb 0x6a58
xorps %xmm0, %xmm0
sqrtsd %xmm1, %xmm0
jmp 0x6a66
movapd %xmm1, %xmm0
callq 0x2160
movsd -0x70(%rbp), %xmm1
andpd 0x1802(%rip), %xmm0     # 0x8270
mulsd 0x1752(%rip), %xmm0     # 0x81c8
movapd %xmm0, -0x60(%rbp)
movapd -0x150(%rbp), %xmm0
divsd %xmm1, %xmm0
callq 0x2360
movsd %xmm0, -0xe0(%rbp)
movsd -0x40(%rbp), %xmm1
ucomisd 0x1777(%rip), %xmm1     # 0x8218
jb 0x6aac
xorps %xmm0, %xmm0
sqrtsd %xmm1, %xmm0
jmp 0x6aba
movapd %xmm1, %xmm0
callq 0x2160
movsd -0x40(%rbp), %xmm1
andpd 0x17ae(%rip), %xmm0     # 0x8270
mulsd 0x1706(%rip), %xmm0     # 0x81d0
movapd %xmm0, -0x140(%rbp)
movapd -0x150(%rbp), %xmm0
divsd %xmm1, %xmm0
callq 0x2360
movapd %xmm0, %xmm3
movsd -0x50(%rbp), %xmm1
ucomisd 0x1724(%rip), %xmm1     # 0x8218
jb 0x6aff
xorps %xmm2, %xmm2
sqrtsd %xmm1, %xmm2
jmp 0x6b21
movapd %xmm1, %xmm0
movsd %xmm3, -0x120(%rbp)
callq 0x2160
movsd -0x120(%rbp), %xmm3
movsd -0x50(%rbp), %xmm1
movapd %xmm0, %xmm2
movapd -0x60(%rbp), %xmm0
mulsd -0x140(%rbp), %xmm3
mulsd -0xe0(%rbp), %xmm0
addsd %xmm3, %xmm0
movapd %xmm0, -0x60(%rbp)
andpd 0x1729(%rip), %xmm2     # 0x8270
movsd 0x1681(%rip), %xmm0     # 0x81d0
mulsd %xmm0, %xmm2
movapd %xmm2, -0xe0(%rbp)
movapd -0x150(%rbp), %xmm0
divsd %xmm1, %xmm0
callq 0x2360
mulsd -0xe0(%rbp), %xmm0
addsd -0x60(%rbp), %xmm0
movq -0xc8(%rbp), %rax
movsd %xmm0, (%rax,%r13)
movsd -0x100(%rbp), %xmm0
movsd 0x15c2(%rip), %xmm1     # 0x8158
callq 0x2340
mulsd 0x162d(%rip), %xmm0     # 0x81d0
movsd %xmm0, -0x60(%rbp)
movapd -0xf0(%rbp), %xmm0
divsd -0x50(%rbp), %xmm0
movapd %xmm0, -0xe0(%rbp)
movsd 0x1593(%rip), %xmm1     # 0x8158
callq 0x2340
callq 0x2250
movsd %xmm0, -0x120(%rbp)
movapd -0xf0(%rbp), %xmm0
divsd -0x40(%rbp), %xmm0
movapd %xmm0, -0x140(%rbp)
movsd 0x1564(%rip), %xmm1     # 0x8158
callq 0x2340
callq 0x2250
addsd -0x120(%rbp), %xmm0
movsd %xmm0, -0xa0(%rbp)
movapd -0xf0(%rbp), %xmm0
divsd -0x70(%rbp), %xmm0
movapd %xmm0, -0x120(%rbp)
movsd 0x152d(%rip), %xmm1     # 0x8158
callq 0x2340
callq 0x2250
movsd -0x70(%rbp), %xmm1
addsd %xmm0, %xmm0
movsd -0xa0(%rbp), %xmm2
subsd %xmm0, %xmm2
mulsd -0x60(%rbp), %xmm2
movq -0xc0(%rbp), %rax
movsd %xmm2, (%rax,%r13)
ucomisd 0x15b4(%rip), %xmm1     # 0x8218
jb 0x6c6f
xorps %xmm0, %xmm0
sqrtsd %xmm1, %xmm0
jmp 0x6c7d
movapd %xmm1, %xmm0
callq 0x2160
movsd -0x70(%rbp), %xmm1
andpd 0x15eb(%rip), %xmm0     # 0x8270
mulsd 0x1563(%rip), %xmm0     # 0x81f0
movapd %xmm0, -0x60(%rbp)
movsd -0x110(%rbp), %xmm0
divsd %xmm1, %xmm0
callq 0x2360
movsd %xmm0, -0xa0(%rbp)
movsd -0x40(%rbp), %xmm1
ucomisd 0x1560(%rip), %xmm1     # 0x8218
jb 0x6cc3
xorps %xmm0, %xmm0
sqrtsd %xmm1, %xmm0
jmp 0x6cd1
movapd %xmm1, %xmm0
callq 0x2160
movsd -0x40(%rbp), %xmm1
andpd 0x1597(%rip), %xmm0     # 0x8270
movapd %xmm0, -0x1c0(%rbp)
movsd -0x110(%rbp), %xmm0
divsd %xmm1, %xmm0
callq 0x2360
movapd -0x1c0(%rbp), %xmm1
mulsd 0x14d6(%rip), %xmm1     # 0x81d8
mulsd %xmm0, %xmm1
movapd -0x60(%rbp), %xmm0
mulsd -0xa0(%rbp), %xmm0
addsd %xmm1, %xmm0
movapd %xmm0, -0x60(%rbp)
movsd -0x50(%rbp), %xmm1
ucomisd 0x14ef(%rip), %xmm1     # 0x8218
jb 0x6d34
xorps %xmm0, %xmm0
sqrtsd %xmm1, %xmm0
jmp 0x6d42
movapd %xmm1, %xmm0
callq 0x2160
movsd -0x50(%rbp), %xmm1
andpd 0x1526(%rip), %xmm0     # 0x8270
movapd %xmm0, -0xa0(%rbp)
movsd -0x110(%rbp), %xmm0
divsd %xmm1, %xmm0
callq 0x2360
movapd -0xa0(%rbp), %xmm1
mulsd 0x1465(%rip), %xmm1     # 0x81d8
mulsd %xmm0, %xmm1
addsd -0x60(%rbp), %xmm1
movq -0xb8(%rbp), %rax
movsd %xmm1, (%rax,%r13)
movsd -0x100(%rbp), %xmm0
movsd 0x13bf(%rip), %xmm1     # 0x8158
callq 0x2340
mulsd 0x1422(%rip), %xmm0     # 0x81c8
movsd %xmm0, -0x60(%rbp)
movapd -0xe0(%rbp), %xmm0
movsd 0x139d(%rip), %xmm1     # 0x8158
callq 0x2340
addsd %xmm0, %xmm0
callq 0x2250
movsd %xmm0, -0xa0(%rbp)
movapd -0x140(%rbp), %xmm0
movsd 0x1377(%rip), %xmm1     # 0x8158
callq 0x2340
addsd %xmm0, %xmm0
callq 0x2250
addsd -0xa0(%rbp), %xmm0
movsd %xmm0, -0xa0(%rbp)
movapd -0x120(%rbp), %xmm0
movsd 0x1349(%rip), %xmm1     # 0x8158
callq 0x2340
addsd %xmm0, %xmm0
callq 0x2250
addsd %xmm0, %xmm0
movsd -0xa0(%rbp), %xmm1
subsd %xmm0, %xmm1
mulsd -0x60(%rbp), %xmm1
movsd %xmm1, (%r14,%r13)
movsd -0x70(%rbp), %xmm1
ucomisd 0x13d3(%rip), %xmm1     # 0x8218
jb 0x6e50
xorps %xmm0, %xmm0
sqrtsd %xmm1, %xmm0
jmp 0x6e5e
movapd %xmm1, %xmm0
callq 0x2160
movsd -0x70(%rbp), %xmm1
andpd 0x140a(%rip), %xmm0     # 0x8270
mulsd 0x135a(%rip), %xmm0     # 0x81c8
movapd %xmm0, -0x70(%rbp)
movsd -0x108(%rbp), %xmm0
divsd %xmm1, %xmm0
callq 0x2360
movsd %xmm0, -0x60(%rbp)
movsd -0x40(%rbp), %xmm1
ucomisd 0x1382(%rip), %xmm1     # 0x8218
jb 0x6ea1
xorps %xmm0, %xmm0
sqrtsd %xmm1, %xmm0
jmp 0x6eaf
movapd %xmm1, %xmm0
callq 0x2160
movsd -0x40(%rbp), %xmm1
andpd 0x13b9(%rip), %xmm0     # 0x8270
mulsd 0x1311(%rip), %xmm0     # 0x81d0
movapd %xmm0, -0x40(%rbp)
movsd -0x108(%rbp), %xmm0
divsd %xmm1, %xmm0
callq 0x2360
movapd %xmm0, %xmm3
movsd -0x50(%rbp), %xmm1
ucomisd 0x1332(%rip), %xmm1     # 0x8218
jb 0x6ef1
xorps %xmm0, %xmm0
sqrtsd %xmm1, %xmm0
jmp 0x6f0f
movapd %xmm1, %xmm0
movsd %xmm3, -0xa0(%rbp)
callq 0x2160
movsd -0xa0(%rbp), %xmm3
movsd -0x50(%rbp), %xmm1
movapd -0x70(%rbp), %xmm2
mulsd -0x40(%rbp), %xmm3
mulsd -0x60(%rbp), %xmm2
addsd %xmm3, %xmm2
movapd %xmm2, -0x70(%rbp)
andpd 0x1341(%rip), %xmm0     # 0x8270
mulsd 0x1299(%rip), %xmm0     # 0x81d0
movapd %xmm0, -0x40(%rbp)
movsd -0x108(%rbp), %xmm0
divsd %xmm1, %xmm0
callq 0x2360
mulsd -0x40(%rbp), %xmm0
addsd -0x70(%rbp), %xmm0
movsd %xmm0, (%r15,%r13)
movsd -0x100(%rbp), %xmm0
movsd 0x11eb(%rip), %xmm1     # 0x8158
callq 0x2340
mulsd 0x11d6(%rip), %xmm0     # 0x8150
movsd %xmm0, -0x50(%rbp)
movapd -0xe0(%rbp), %xmm0
movsd 0x11c9(%rip), %xmm1     # 0x8158
callq 0x2340
movsd 0x1274(%rip), %xmm1     # 0x8210
mulsd %xmm1, %xmm0
callq 0x2250
movsd %xmm0, -0x40(%rbp)
movapd -0x140(%rbp), %xmm0
movsd 0x119e(%rip), %xmm1     # 0x8158
callq 0x2340
mulsd 0x1249(%rip), %xmm0     # 0x8210
callq 0x2250
addsd -0x40(%rbp), %xmm0
movsd %xmm0, -0x40(%rbp)
movapd -0x120(%rbp), %xmm0
movsd 0x1172(%rip), %xmm1     # 0x8158
callq 0x2340
mulsd 0x121d(%rip), %xmm0     # 0x8210
callq 0x2250
addsd %xmm0, %xmm0
movsd -0x40(%rbp), %xmm1
subsd %xmm0, %xmm1
mulsd -0x50(%rbp), %xmm1
movsd %xmm1, (%r12,%r13)
addq $0x8, %r13
cmpq %r13, -0x1a8(%rbp)
jne 0x6969
movq 0x58(%rbp), %r13
cmpl $0x0, -0x74(%rbp)
movq -0x198(%rbp), %rcx
movq -0xa8(%rbp), %rdx
movq -0xc8(%rbp), %rsi
movq -0xc0(%rbp), %rdi
movq -0xb8(%rbp), %r8
jle 0x7086
xorl %eax, %eax
movsd (%rdx,%rax,8), %xmm0
addsd (%rsi,%rax,8), %xmm0
addsd (%rdi,%rax,8), %xmm0
addsd (%r8,%rax,8), %xmm0
addsd (%r14,%rax,8), %xmm0
addsd (%r15,%rax,8), %xmm0
addsd (%r12,%rax,8), %xmm0
movsd %xmm0, (%r13,%rax,8)
incq %rax
cmpq %rax, %rcx
jne 0x7050
movq 0x40(%rbp), %r14
movq 0x38(%rbp), %rbx
movq 0x10(%rbp), %rax
movsd (%rax), %xmm4
movq 0x18(%rbp), %rax
movsd (%rax), %xmm3
movq 0x30(%rbp), %rax
movsd (%rax), %xmm0
movq 0x28(%rbp), %rax
movsd (%rax), %xmm1
movapd 0x108a(%rip), %xmm6     # 0x8140
xorpd %xmm0, %xmm6
movapd %xmm0, %xmm7
divsd %xmm4, %xmm7
movq 0x20(%rbp), %rax
movsd (%rax), %xmm2
movapd %xmm0, %xmm5
mulsd %xmm0, %xmm5
movapd %xmm4, %xmm9
unpcklpd %xmm3, %xmm9            # xmm9 = xmm9[0],xmm3[0]
mulpd %xmm9, %xmm9
movsd 0xf1e(%rip), %xmm11     # 0x8008
movapd %xmm11, %xmm8
unpcklpd %xmm6, %xmm8            # xmm8 = xmm8[0],xmm6[0]
divpd %xmm9, %xmm8
movapd %xmm11, %xmm10
unpcklpd %xmm7, %xmm10           # xmm10 = xmm10[0],xmm7[0]
shufpd $0x1, %xmm3, %xmm9      # xmm9 = xmm9[1],xmm3[0]
divpd %xmm9, %xmm10
movapd %xmm8, %xmm9
addpd %xmm10, %xmm9
subpd %xmm10, %xmm8
movapd 0x115b(%rip), %xmm7     # 0x8280
unpcklpd %xmm0, %xmm7            # xmm7 = xmm7[0],xmm0[0]
movapd %xmm4, %xmm10
unpcklpd %xmm2, %xmm10           # xmm10 = xmm10[0],xmm2[0]
divpd %xmm10, %xmm7
movapd %xmm3, %xmm10
unpcklpd %xmm3, %xmm10           # xmm10 = xmm10[0],xmm3[0]
divpd %xmm10, %xmm7
addpd %xmm7, %xmm9
subpd %xmm7, %xmm8
movapd %xmm0, %xmm7
unpcklpd %xmm5, %xmm7            # xmm7 = xmm7[0],xmm5[0]
divpd %xmm10, %xmm7
movapd %xmm1, %xmm10
unpcklpd %xmm1, %xmm10           # xmm10 = xmm10[0],xmm1[0]
divpd %xmm10, %xmm7
addpd %xmm7, %xmm9
subpd %xmm7, %xmm8
movsd %xmm9, %xmm8            # xmm8 = xmm9[0],xmm8[1]
movapd %xmm8, -0x170(%rbp)
movapd %xmm1, %xmm8
mulsd %xmm1, %xmm8
divsd %xmm8, %xmm6
movapd %xmm11, %xmm9
divsd %xmm2, %xmm9
divsd %xmm1, %xmm9
subsd %xmm9, %xmm6
movapd %xmm11, %xmm9
divsd %xmm4, %xmm9
divsd %xmm1, %xmm9
subsd %xmm9, %xmm6
movapd %xmm11, %xmm9
divsd %xmm3, %xmm9
divsd %xmm1, %xmm9
subsd %xmm9, %xmm6
movsd %xmm6, -0x160(%rbp)
movapd %xmm2, %xmm6
mulsd %xmm2, %xmm6
movapd %xmm11, %xmm9
divsd %xmm6, %xmm9
divsd %xmm8, %xmm5
addsd %xmm9, %xmm5
movapd %xmm0, %xmm6
addsd %xmm0, %xmm6
divsd %xmm2, %xmm6
divsd %xmm1, %xmm6
addsd %xmm5, %xmm6
addsd %xmm7, %xmm6
movsd %xmm6, -0x158(%rbp)
movapd -0x90(%rbp), %xmm5
mulsd %xmm5, %xmm5
divsd 0xf28(%rip), %xmm5      # 0x8150
unpcklpd %xmm5, %xmm5            # xmm5 = xmm5[0,0]
xorl %eax, %eax
movapd -0x170(%rbp,%rax,8), %xmm6
mulpd %xmm5, %xmm6
movapd %xmm6, -0x170(%rbp,%rax,8)
addq $0x2, %rax
cmpq $0x4, %rax
jne 0x722e
addsd %xmm4, %xmm4
movapd -0x90(%rbp), %xmm7
movapd %xmm7, %xmm5
divsd %xmm4, %xmm5
movsd 0xd9e(%rip), %xmm4      # 0x8008
addsd %xmm4, %xmm5
movapd %xmm4, %xmm8
addsd %xmm3, %xmm3
movl -0xac(%rbp), %eax
negl %eax
xorps %xmm4, %xmm4
cvtsi2sd %eax, %xmm4
movapd %xmm7, %xmm6
unpcklpd %xmm4, %xmm6            # xmm6 = xmm6[0],xmm4[0]
unpcklpd %xmm3, %xmm3            # xmm3 = xmm3[0,0]
divpd %xmm3, %xmm6
movapd %xmm5, %xmm3
unpcklpd %xmm0, %xmm3            # xmm3 = xmm3[0],xmm0[0]
addpd %xmm6, %xmm5
mulpd %xmm6, %xmm3
movsd %xmm5, %xmm3            # xmm3 = xmm5[0],xmm3[1]
movapd %xmm3, -0x190(%rbp)
addsd %xmm1, %xmm1
divsd %xmm1, %xmm4
movsd %xmm4, -0x180(%rbp)
addsd %xmm2, %xmm2
movapd %xmm7, %xmm3
divsd %xmm2, %xmm3
addsd %xmm8, %xmm3
movapd %xmm7, %xmm2
divsd %xmm1, %xmm2
mulsd %xmm0, %xmm2
addsd %xmm3, %xmm2
movapd %xmm2, -0x50(%rbp)
movq 0x48(%rbp), %r12
movsd (%r12), %xmm0
addsd %xmm0, %xmm0
movsd %xmm0, -0x40(%rbp)
movapd %xmm7, %xmm0
movq 0x50(%rbp), %r15
divsd (%r15), %xmm0
movsd 0xe48(%rip), %xmm1      # 0x8158
callq 0x2340
mulsd -0x40(%rbp), %xmm0
addsd -0x50(%rbp), %xmm0
movsd %xmm0, -0x178(%rbp)
movq 0x10(%rbp), %rax
movsd (%rax), %xmm0
addsd %xmm0, %xmm0
movapd -0x90(%rbp), %xmm3
movapd %xmm3, %xmm1
divsd %xmm0, %xmm1
movsd 0xcbd(%rip), %xmm4      # 0x8008
movapd %xmm4, %xmm0
subsd %xmm1, %xmm0
movq 0x18(%rbp), %rax
movsd (%rax), %xmm1
addsd %xmm1, %xmm1
movapd %xmm3, %xmm2
divsd %xmm1, %xmm2
subsd %xmm2, %xmm0
movsd %xmm0, (%r14)
movsd (%rax), %xmm0
addsd %xmm0, %xmm0
movapd %xmm3, %xmm1
divsd %xmm0, %xmm1
movq 0x30(%rbp), %rax
mulsd (%rax), %xmm1
movsd %xmm1, 0x8(%r14)
movq 0x28(%rbp), %rcx
movsd (%rcx), %xmm0
addsd %xmm0, %xmm0
movapd %xmm3, %xmm1
divsd %xmm0, %xmm1
movsd %xmm1, 0x10(%r14)
movq 0x20(%rbp), %rdx
movsd (%rdx), %xmm0
addsd %xmm0, %xmm0
movapd %xmm3, %xmm1
divsd %xmm0, %xmm1
movapd %xmm4, %xmm2
subsd %xmm1, %xmm2
movsd (%rcx), %xmm0
addsd %xmm0, %xmm0
movapd %xmm3, %xmm1
divsd %xmm0, %xmm1
mulsd (%rax), %xmm1
subsd %xmm1, %xmm2
movapd %xmm2, -0x50(%rbp)
movq -0x128(%rbp), %rax
movsd (%r13,%rax,8), %xmm0
mulsd (%r12), %xmm0
movsd %xmm0, -0x40(%rbp)
divsd (%r15), %xmm3
movapd %xmm3, %xmm0
movsd 0xd4d(%rip), %xmm1      # 0x8158
callq 0x2340
mulsd -0x40(%rbp), %xmm0
addsd -0x50(%rbp), %xmm0
movsd %xmm0, 0x18(%r14)
xorl %eax, %eax
movapd -0x170(%rbp,%rax,8), %xmm0
movapd -0x190(%rbp,%rax,8), %xmm1
addpd %xmm0, %xmm1
movapd %xmm1, -0x190(%rbp,%rax,8)
movupd (%r14,%rax,8), %xmm1
addpd %xmm0, %xmm1
movupd %xmm1, (%r14,%rax,8)
addq $0x2, %rax
cmpq $0x4, %rax
jne 0x7422
leaq -0x190(%rbp), %rdi
movq %rbx, %rsi
callq 0x5def
movq -0x1a0(%rbp), %rsp
leaq -0x28(%rbp), %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq