// File: /workspace/github_cpp_makefile_star2_O2/snesic[P]stochastic_thin_films/newton-raphson_tools.cpp
// Function: calculate_matrix_A(double**, int const&, double*, double*, double*, double const&, double const&, double const&)
void calculate_matrix_A(double **a, const int& L, double *y, double *y2, double *y3, const double& theta, const double& dx, const double& dt)
{ int i,j; double dx4dt = dt/(dx*dx*dx*dx);
    
    // B.C. for the coefficients left:
    a[0][2] =   -3*( y3[0] + y3[1] ) -   3*y2[0]*( y[2]-4*y[1]+3*y[0] );
    a[0][3] =    2*( y3[0] + y3[1] ) - 1.5*y2[1]*( y[2]-4*y[1]+3*y[0] );
    a[0][4] = -0.5*( y3[0] + y3[1] );
    
    a[1][1] =  0.5*( y3[1] + y3[2] ) + 1.5*( y3[0] + y3[1] ) + 1.5*y2[0]*( y[2]-4*y[1]+3*y[0] );
    a[1][2] = -1.5*y2[1]*( y[3]-4*y[2]+7*y[1]-4*y[0] )
    -1.5*( y3[0] + 2*y3[1] + y3[2]);
    a[1][3] = -1.5*y2[2]*( y[3]-3*y[2]+3*y[1]-y[0] )
    + 1.5*( y3[1] + y3[2])
    + 0.5*( y3[0] + y3[1] );
    a[1][4] = -0.5*( y3[1] + y3[2] );
    
    // B. C. for the newton_Raphson equation:
    
    a[0][3]=2*a[0][3];
    a[1][2]=a[1][2] + a[0][4];//-0.5*(y3[0]+y3[1]);
    a[0][4]=2*a[0][4];
    
    for(i=2;i<L-2;i++)
    {
        a[i][0] = -0.5*( y3[i] + y3[i-1] );
        a[i][1] =  0.5*( y3[i] + y3[i+1] ) + 1.5*y2[i-1]*( y[i+1]-3*y[i]+3*y[i-1]-y[i-2] )
        + 1.5*( y3[i] + y3[i-1] );
        a[i][2] = -1.5*( y3[i] + y3[i+1] ) - 1.5*y2[i] * ( y[i+2]-4*y[i+1]+6*y[i]-4*y[i-1]+y[i-2] )
        -1.5*( y3[i] + y3[i-1] );
        a[i][3] =  1.5*( y3[i] + y3[i+1] ) - 1.5*y2[i+1]*( y[i+2]-3*y[i+1]+3*y[i]-y[i-1] )
        + 0.5*( y3[i] + y3[i-1] );
        a[i][4] = -0.5*( y3[i] + y3[i+1] );
    }
    
    // B.C. for the coefficients right:
    a[L-2][0] = -0.5*( y3[L-3] + y3[L-2] );
    a[L-2][1] =  0.5*( y3[L-2] + y3[L-1] ) + 1.5*y2[L-3]*( y[L-1]-3*y[L-2]+3*y[L-3]-y[L-4] )
    +1.5*( y3[L-3] + y3[L-2] );
    a[L-2][2] = -1.5*( y3[L-2] + y3[L-1] ) - 1.5*y2[L-2] * ( -4*y[L-1]+7*y[L-2]-4*y[L-3]+y[L-4] )
    -1.5*( y3[L-2] + y3[L-3] );
    a[L-2][3] =  1.5*( y3[L-2] + y3[L-1] ) - 1.5*y2[L-1]*( -3*y[L-1]+4*y[L-2]-y[L-3] )
    +0.5*( y3[L-2] + y3[L-3] );
    
    a[L-1][0] = -0.5*( y3[L-1] + y3[L-2] );
    a[L-1][1] =    2*( y3[L-1] + y3[L-2] ) + 1.5*y2[L-2]*( 4*y[L-2]-3*y[L-1]-y[L-3] );
    a[L-1][2] = -  3*( y3[L-1] + y3[L-2] ) -   3*y2[L-1]*( y[L-3]+3*y[L-1]-4*y[L-2] );
    
    // B. C. for the newton_Raphson equation:
    
    a[L-1][1]=2*a[L-1][1];
    a[L-2][2]=a[L-2][2] + a[L-1][0]; //-0.5*(y3[L-1]+y3[L-2]);
    a[L-1][0]=2*a[L-1][0];
    
    for(i=0;i<L;i++)
    for(j=0;j<5;j++)
    a[i][j]=theta*a[i][j]*dx4dt*(-1);     // This should be changed (should be done before)
    for(i=0;i<L;i++) a[i][2]=1+a[i][2];
}

// Assembly:
movq 0x8(%rsp), %rax
movq 0x10(%rsp), %r10
movsd (%r10), %xmm0
movsd (%rax), %xmm5
movapd %xmm5, %xmm4
mulsd %xmm5, %xmm4
movsd (%r8), %xmm6
addsd 0x8(%r8), %xmm6
movsd 0x3bbe(%rip), %xmm1     # 0x7b70
movsd 0x8(%rdx), %xmm2
mulsd %xmm1, %xmm2
addsd 0x10(%rdx), %xmm2
mulsd %xmm5, %xmm4
movsd 0x21bc(%rip), %xmm3     # 0x6188
movsd (%rdx), %xmm7
mulsd %xmm3, %xmm7
addsd %xmm2, %xmm7
movsd 0x21a0(%rip), %xmm2     # 0x6180
movsd (%rcx), %xmm8
mulsd %xmm2, %xmm8
mulsd %xmm7, %xmm8
mulsd %xmm2, %xmm6
addsd %xmm8, %xmm6
movq (%rdi), %rax
movsd %xmm6, 0x10(%rax)
movsd (%r8), %xmm7
addsd 0x8(%r8), %xmm7
movsd 0x8(%rdx), %xmm6
mulsd %xmm1, %xmm6
addsd 0x10(%rdx), %xmm6
mulsd %xmm5, %xmm4
movsd (%rdx), %xmm5
mulsd %xmm3, %xmm5
addsd %xmm6, %xmm5
movsd 0x3b47(%rip), %xmm6     # 0x7b78
movsd 0x8(%rcx), %xmm8
mulsd %xmm6, %xmm8
mulsd %xmm5, %xmm8
addsd %xmm7, %xmm7
addsd %xmm8, %xmm7
movsd %xmm7, 0x18(%rax)
movsd (%r8), %xmm5
addsd 0x8(%r8), %xmm5
movsd 0x212e(%rip), %xmm7     # 0x6190
mulsd %xmm7, %xmm5
movsd %xmm5, 0x20(%rax)
movsd 0x8(%r8), %xmm9
movsd 0x10(%r8), %xmm10
addsd %xmm9, %xmm10
addsd (%r8), %xmm9
movsd 0x3af7(%rip), %xmm5     # 0x7b80
mulsd %xmm5, %xmm9
movsd 0x20e1(%rip), %xmm8     # 0x6178
mulsd %xmm8, %xmm10
addsd %xmm9, %xmm10
movsd (%rcx), %xmm9
movsd 0x8(%rdx), %xmm11
mulsd %xmm1, %xmm11
addsd 0x10(%rdx), %xmm11
mulsd %xmm5, %xmm9
movsd (%rdx), %xmm12
mulsd %xmm3, %xmm12
addsd %xmm11, %xmm12
mulsd %xmm9, %xmm12
addsd %xmm10, %xmm12
movq 0x8(%rdi), %r10
movsd %xmm12, 0x8(%r10)
movsd 0x10(%rdx), %xmm9
mulsd %xmm1, %xmm9
addsd 0x18(%rdx), %xmm9
movsd 0x8(%rcx), %xmm10
movsd 0x8(%rdx), %xmm11
mulsd 0x3a83(%rip), %xmm11    # 0x7b88
mulsd %xmm6, %xmm10
addsd %xmm9, %xmm11
movsd (%rdx), %xmm9
mulsd %xmm1, %xmm9
addsd %xmm11, %xmm9
mulsd %xmm10, %xmm9
movsd 0x8(%r8), %xmm10
addsd %xmm10, %xmm10
addsd (%r8), %xmm10
addsd 0x10(%r8), %xmm10
mulsd %xmm6, %xmm10
addsd %xmm9, %xmm10
movsd %xmm10, 0x10(%r10)
movsd 0x10(%rcx), %xmm9
movsd 0x10(%rdx), %xmm10
mulsd %xmm2, %xmm10
addsd 0x18(%rdx), %xmm10
mulsd %xmm6, %xmm9
movsd 0x8(%rdx), %xmm11
mulsd %xmm3, %xmm11
addsd %xmm10, %xmm11
subsd (%rdx), %xmm11
mulsd %xmm9, %xmm11
movsd 0x8(%r8), %xmm9
movsd 0x10(%r8), %xmm10
addsd %xmm9, %xmm10
mulsd %xmm5, %xmm10
addsd %xmm11, %xmm10
addsd (%r8), %xmm9
mulsd %xmm8, %xmm9
addsd %xmm10, %xmm9
movsd %xmm9, 0x18(%r10)
movsd 0x8(%r8), %xmm9
addsd 0x10(%r8), %xmm9
mulsd %xmm7, %xmm9
movsd %xmm9, 0x20(%r10)
movsd 0x18(%rax), %xmm9
addsd %xmm9, %xmm9
movsd %xmm9, 0x18(%rax)
movsd 0x10(%r10), %xmm9
addsd 0x20(%rax), %xmm9
movsd %xmm9, 0x10(%r10)
movsd 0x20(%rax), %xmm9
addsd %xmm9, %xmm9
movsd %xmm9, 0x20(%rax)
movslq (%rsi), %rax
leaq -0x2(%rax), %rsi
pushq $0x2
popq %r10
movsd 0x1f8a(%rip), %xmm9     # 0x6198
cmpq %rsi, %r10
jge 0x43ac
movsd (%r8,%r10,8), %xmm10
addsd -0x8(%r8,%r10,8), %xmm10
mulsd %xmm7, %xmm10
movq (%rdi,%r10,8), %r11
movsd %xmm10, (%r11)
movsd (%r8,%r10,8), %xmm10
movsd 0x8(%r8,%r10,8), %xmm11
addsd %xmm10, %xmm11
movsd -0x8(%rcx,%r10,8), %xmm12
movsd (%rdx,%r10,8), %xmm13
mulsd %xmm2, %xmm13
addsd 0x8(%rdx,%r10,8), %xmm13
mulsd %xmm5, %xmm12
movsd -0x8(%rdx,%r10,8), %xmm14
mulsd %xmm3, %xmm14
addsd %xmm13, %xmm14
subsd -0x10(%rdx,%r10,8), %xmm14
mulsd %xmm12, %xmm14
mulsd %xmm8, %xmm11
addsd %xmm14, %xmm11
addsd -0x8(%r8,%r10,8), %xmm10
mulsd %xmm5, %xmm10
addsd %xmm11, %xmm10
movsd %xmm10, 0x8(%r11)
movsd (%r8,%r10,8), %xmm10
movsd 0x8(%r8,%r10,8), %xmm11
movsd 0x8(%rdx,%r10,8), %xmm12
mulsd %xmm1, %xmm12
addsd 0x10(%rdx,%r10,8), %xmm12
movsd (%rdx,%r10,8), %xmm13
mulsd %xmm9, %xmm13
addsd %xmm12, %xmm13
movsd -0x8(%rdx,%r10,8), %xmm12
mulsd %xmm1, %xmm12
addsd %xmm13, %xmm12
addsd -0x10(%rdx,%r10,8), %xmm12
addsd %xmm10, %xmm11
movsd (%rcx,%r10,8), %xmm13
mulsd %xmm6, %xmm13
mulsd %xmm12, %xmm13
mulsd %xmm6, %xmm11
addsd %xmm13, %xmm11
addsd -0x8(%r8,%r10,8), %xmm10
mulsd %xmm6, %xmm10
addsd %xmm11, %xmm10
movsd %xmm10, 0x10(%r11)
movsd (%r8,%r10,8), %xmm10
movsd 0x8(%r8,%r10,8), %xmm11
addsd %xmm10, %xmm11
movsd 0x8(%rdx,%r10,8), %xmm12
mulsd %xmm2, %xmm12
addsd 0x10(%rdx,%r10,8), %xmm12
movsd (%rdx,%r10,8), %xmm13
mulsd %xmm3, %xmm13
addsd %xmm12, %xmm13
subsd -0x8(%rdx,%r10,8), %xmm13
movsd 0x8(%rcx,%r10,8), %xmm12
mulsd %xmm6, %xmm12
mulsd %xmm13, %xmm12
mulsd %xmm5, %xmm11
addsd %xmm12, %xmm11
addsd -0x8(%r8,%r10,8), %xmm10
mulsd %xmm8, %xmm10
addsd %xmm11, %xmm10
movsd %xmm10, 0x18(%r11)
movsd (%r8,%r10,8), %xmm10
addsd 0x8(%r8,%r10,8), %xmm10
incq %r10
mulsd %xmm7, %xmm10
movsd %xmm10, 0x20(%r11)
jmp 0x420e
movsd -0x18(%r8,%rax,8), %xmm9
addsd -0x10(%r8,%rax,8), %xmm9
mulsd %xmm7, %xmm9
movq -0x10(%rdi,%rax,8), %rsi
movsd %xmm9, (%rsi)
movsd -0x10(%r8,%rax,8), %xmm9
movsd -0x8(%r8,%rax,8), %xmm10
movsd -0x10(%rdx,%rax,8), %xmm11
mulsd %xmm2, %xmm11
addsd -0x8(%rdx,%rax,8), %xmm11
addsd %xmm9, %xmm10
movsd -0x18(%rdx,%rax,8), %xmm12
mulsd %xmm3, %xmm12
addsd %xmm11, %xmm12
movsd -0x18(%rcx,%rax,8), %xmm11
mulsd %xmm5, %xmm11
subsd -0x20(%rdx,%rax,8), %xmm12
mulsd %xmm11, %xmm12
mulsd %xmm8, %xmm10
addsd -0x18(%r8,%rax,8), %xmm9
addsd %xmm12, %xmm10
mulsd %xmm5, %xmm9
addsd %xmm10, %xmm9
movsd %xmm9, 0x8(%rsi)
movsd -0x10(%r8,%rax,8), %xmm9
movsd -0x8(%r8,%rax,8), %xmm10
addsd %xmm9, %xmm10
movsd -0x10(%rdx,%rax,8), %xmm11
mulsd 0x372c(%rip), %xmm11    # 0x7b88
movsd -0x8(%rdx,%rax,8), %xmm12
mulsd %xmm1, %xmm12
addsd %xmm11, %xmm12
movsd -0x18(%rdx,%rax,8), %xmm11
mulsd %xmm1, %xmm11
addsd %xmm12, %xmm11
addsd -0x20(%rdx,%rax,8), %xmm11
movsd -0x10(%rcx,%rax,8), %xmm12
mulsd %xmm6, %xmm12
mulsd %xmm11, %xmm12
mulsd %xmm6, %xmm10
addsd -0x18(%r8,%rax,8), %xmm9
addsd %xmm12, %xmm10
mulsd %xmm6, %xmm9
addsd %xmm10, %xmm9
movsd %xmm9, 0x10(%rsi)
movsd -0x10(%r8,%rax,8), %xmm10
movsd 0x3631(%rip), %xmm9     # 0x7af8
movsd -0x10(%rdx,%rax,8), %xmm11
mulsd %xmm9, %xmm11
movsd -0x8(%rdx,%rax,8), %xmm12
mulsd %xmm2, %xmm12
addsd %xmm11, %xmm12
movsd -0x8(%r8,%rax,8), %xmm11
subsd -0x18(%rdx,%rax,8), %xmm12
mulsd -0x8(%rcx,%rax,8), %xmm6
addsd %xmm10, %xmm11
mulsd %xmm12, %xmm6
mulsd %xmm5, %xmm11
addsd %xmm6, %xmm11
addsd -0x18(%r8,%rax,8), %xmm10
mulsd %xmm8, %xmm10
addsd %xmm11, %xmm10
movsd %xmm10, 0x18(%rsi)
movsd -0x8(%r8,%rax,8), %xmm6
addsd -0x10(%r8,%rax,8), %xmm6
mulsd %xmm7, %xmm6
movq -0x8(%rdi,%rax,8), %rsi
movsd %xmm6, (%rsi)
movsd -0x8(%r8,%rax,8), %xmm7
addsd -0x10(%r8,%rax,8), %xmm7
mulsd -0x10(%rcx,%rax,8), %xmm5
movsd -0x8(%rdx,%rax,8), %xmm8
mulsd -0x10(%rdx,%rax,8), %xmm9
mulsd %xmm2, %xmm8
addsd %xmm8, %xmm9
subsd -0x18(%rdx,%rax,8), %xmm9
divsd %xmm4, %xmm0
mulsd %xmm5, %xmm9
addsd %xmm7, %xmm7
addsd %xmm9, %xmm7
movsd %xmm7, 0x8(%rsi)
movsd -0x8(%r8,%rax,8), %xmm4
addsd -0x10(%r8,%rax,8), %xmm4
mulsd -0x8(%rdx,%rax,8), %xmm3
addsd -0x18(%rdx,%rax,8), %xmm3
mulsd -0x10(%rdx,%rax,8), %xmm1
addsd %xmm3, %xmm1
mulsd %xmm2, %xmm4
mulsd -0x8(%rcx,%rax,8), %xmm2
mulsd %xmm1, %xmm2
addsd %xmm4, %xmm2
movsd %xmm2, 0x10(%rsi)
addsd %xmm7, %xmm7
movsd %xmm7, 0x8(%rsi)
movq -0x10(%rdi,%rax,8), %rcx
addsd 0x10(%rcx), %xmm6
movsd %xmm6, 0x10(%rcx)
movsd (%rsi), %xmm1
addsd %xmm1, %xmm1
movsd %xmm1, (%rsi)
xorl %edx, %edx
testl %eax, %eax
movl $0x0, %ecx
cmovgl %eax, %ecx
movapd 0x1b55(%rip), %xmm1     # 0x6150
cmpq %rcx, %rdx
je 0x462d
movq (%rdi,%rdx,8), %rax
xorl %esi, %esi
cmpq $0x5, %rsi
je 0x4628
movsd (%r9), %xmm2
xorpd %xmm1, %xmm2
mulsd (%rax,%rsi,8), %xmm2
mulsd %xmm0, %xmm2
movsd %xmm2, (%rax,%rsi,8)
incq %rsi
jmp 0x4606
incq %rdx
jmp 0x45fb
xorl %eax, %eax
movsd 0x19e9(%rip), %xmm0     # 0x6020
cmpq %rax, %rcx
je 0x4653
movq (%rdi,%rax,8), %rdx
movsd 0x10(%rdx), %xmm1
addsd %xmm0, %xmm1
movsd %xmm1, 0x10(%rdx)
incq %rax
jmp 0x4637
retq