// File: /workspace/github_cpp_makefile_star2_O3/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:
pushq %r14
pushq %rbx
movq 0x18(%rsp), %rax
movq 0x20(%rsp), %r10
movsd (%r10), %xmm0
movsd (%r8), %xmm5
addsd 0x8(%r8), %xmm5
movsd 0x44a0(%rip), %xmm2     # 0x8b00
movsd 0x8(%rdx), %xmm3
mulsd %xmm2, %xmm3
addsd 0x10(%rdx), %xmm3
movsd (%rax), %xmm1
movsd 0x2b3e(%rip), %xmm4     # 0x71b8
movsd (%rdx), %xmm6
mulsd %xmm4, %xmm6
addsd %xmm3, %xmm6
movsd 0x2b22(%rip), %xmm3     # 0x71b0
movsd (%rcx), %xmm7
mulsd %xmm3, %xmm7
mulsd %xmm6, %xmm7
mulsd %xmm3, %xmm5
addsd %xmm7, %xmm5
movq (%rdi), %rax
movsd %xmm5, 0x10(%rax)
movsd (%r8), %xmm5
addsd 0x8(%r8), %xmm5
movsd 0x8(%rdx), %xmm6
mulsd %xmm2, %xmm6
addsd 0x10(%rdx), %xmm6
movsd (%rdx), %xmm7
mulsd %xmm4, %xmm7
addsd %xmm6, %xmm7
movsd 0x4431(%rip), %xmm6     # 0x8b08
movsd 0x8(%rcx), %xmm8
mulsd %xmm6, %xmm8
mulsd %xmm7, %xmm8
addsd %xmm5, %xmm5
addsd %xmm8, %xmm5
movsd %xmm5, 0x18(%rax)
movsd (%r8), %xmm5
addsd 0x8(%r8), %xmm5
movsd 0x2ab8(%rip), %xmm7     # 0x71c0
mulsd %xmm7, %xmm5
movsd %xmm5, 0x20(%rax)
movsd 0x8(%r8), %xmm9
movsd 0x10(%r8), %xmm10
addsd %xmm9, %xmm10
addsd (%r8), %xmm9
movsd 0x43e1(%rip), %xmm5     # 0x8b10
mulsd %xmm5, %xmm9
movsd 0x2a6b(%rip), %xmm8     # 0x71a8
mulsd %xmm8, %xmm10
addsd %xmm9, %xmm10
movsd (%rcx), %xmm9
movsd 0x8(%rdx), %xmm11
mulsd %xmm2, %xmm11
addsd 0x10(%rdx), %xmm11
mulsd %xmm5, %xmm9
movsd (%rdx), %xmm12
mulsd %xmm4, %xmm12
addsd %xmm11, %xmm12
mulsd %xmm9, %xmm12
addsd %xmm10, %xmm12
movq 0x8(%rdi), %r10
movsd %xmm12, 0x8(%r10)
movsd 0x10(%rdx), %xmm9
mulsd %xmm2, %xmm9
addsd 0x18(%rdx), %xmm9
movsd 0x8(%rcx), %xmm10
movsd 0x8(%rdx), %xmm11
mulsd 0x436d(%rip), %xmm11    # 0x8b18
mulsd %xmm6, %xmm10
addsd %xmm9, %xmm11
movsd (%rdx), %xmm9
mulsd %xmm2, %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 %xmm3, %xmm10
addsd 0x18(%rdx), %xmm10
mulsd %xmm6, %xmm9
movsd 0x8(%rdx), %xmm11
mulsd %xmm4, %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
leal -0x2(%rax), %esi
cmpq $0x5, %rax
jl 0x4a5f
movl %esi, %r10d
movl $0x2, %r11d
movsd 0x2906(%rip), %xmm9     # 0x71c8
movsd (%r8,%r11,8), %xmm10
addsd -0x8(%r8,%r11,8), %xmm10
mulsd %xmm7, %xmm10
movq (%rdi,%r11,8), %rbx
movsd %xmm10, (%rbx)
movsd (%r8,%r11,8), %xmm10
movsd 0x8(%r8,%r11,8), %xmm11
addsd %xmm10, %xmm11
movsd -0x8(%rcx,%r11,8), %xmm12
movsd (%rdx,%r11,8), %xmm13
mulsd %xmm3, %xmm13
addsd 0x8(%rdx,%r11,8), %xmm13
movsd -0x8(%rdx,%r11,8), %xmm14
mulsd %xmm4, %xmm14
addsd %xmm13, %xmm14
subsd -0x10(%rdx,%r11,8), %xmm14
mulsd %xmm5, %xmm12
mulsd %xmm12, %xmm14
mulsd %xmm8, %xmm11
addsd %xmm14, %xmm11
addsd -0x8(%r8,%r11,8), %xmm10
mulsd %xmm5, %xmm10
addsd %xmm11, %xmm10
movsd %xmm10, 0x8(%rbx)
movsd (%r8,%r11,8), %xmm10
movsd 0x8(%r8,%r11,8), %xmm11
addsd %xmm10, %xmm11
movsd 0x8(%rdx,%r11,8), %xmm12
mulsd %xmm2, %xmm12
addsd 0x10(%rdx,%r11,8), %xmm12
movsd (%rdx,%r11,8), %xmm13
mulsd %xmm9, %xmm13
addsd %xmm12, %xmm13
movsd -0x8(%rdx,%r11,8), %xmm12
mulsd %xmm2, %xmm12
addsd %xmm13, %xmm12
addsd -0x10(%rdx,%r11,8), %xmm12
movsd (%rcx,%r11,8), %xmm13
mulsd %xmm6, %xmm13
mulsd %xmm12, %xmm13
mulsd %xmm6, %xmm11
addsd %xmm13, %xmm11
addsd -0x8(%r8,%r11,8), %xmm10
mulsd %xmm6, %xmm10
addsd %xmm11, %xmm10
movsd %xmm10, 0x10(%rbx)
movsd (%r8,%r11,8), %xmm10
movsd 0x8(%r8,%r11,8), %xmm11
movsd 0x8(%rdx,%r11,8), %xmm12
mulsd %xmm3, %xmm12
addsd 0x10(%rdx,%r11,8), %xmm12
addsd %xmm10, %xmm11
movsd (%rdx,%r11,8), %xmm13
mulsd %xmm4, %xmm13
addsd %xmm12, %xmm13
subsd -0x8(%rdx,%r11,8), %xmm13
movsd 0x8(%rcx,%r11,8), %xmm12
mulsd %xmm6, %xmm12
mulsd %xmm13, %xmm12
mulsd %xmm5, %xmm11
addsd -0x8(%r8,%r11,8), %xmm10
addsd %xmm12, %xmm11
mulsd %xmm8, %xmm10
addsd %xmm11, %xmm10
movsd %xmm10, 0x18(%rbx)
movsd (%r8,%r11,8), %xmm10
addsd 0x8(%r8,%r11,8), %xmm10
leaq 0x1(%r11), %r14
mulsd %xmm7, %xmm10
movsd %xmm10, 0x20(%rbx)
movq %r14, %r11
cmpq %r14, %r10
jne 0x48c2
movsd -0x18(%r8,%rax,8), %xmm9
movslq %esi, %rsi
addsd (%r8,%rsi,8), %xmm9
mulsd %xmm7, %xmm9
movq (%rdi,%rsi,8), %r10
movsd %xmm9, (%r10)
movsd (%r8,%rsi,8), %xmm9
movsd -0x8(%r8,%rax,8), %xmm10
addsd %xmm9, %xmm10
movsd -0x18(%rcx,%rax,8), %xmm11
mulsd %xmm5, %xmm11
movsd (%rdx,%rsi,8), %xmm12
mulsd %xmm3, %xmm12
addsd -0x8(%rdx,%rax,8), %xmm12
movsd -0x18(%rdx,%rax,8), %xmm13
mulsd %xmm4, %xmm13
addsd %xmm12, %xmm13
subsd -0x20(%rdx,%rax,8), %xmm13
mulsd %xmm11, %xmm13
mulsd %xmm8, %xmm10
addsd -0x18(%r8,%rax,8), %xmm9
addsd %xmm13, %xmm10
mulsd %xmm5, %xmm9
addsd %xmm10, %xmm9
movsd %xmm9, 0x8(%r10)
movsd (%r8,%rsi,8), %xmm9
movsd -0x8(%r8,%rax,8), %xmm10
addsd %xmm9, %xmm10
movsd (%rdx,%rsi,8), %xmm11
mulsd 0x400c(%rip), %xmm11    # 0x8b18
movsd -0x8(%rdx,%rax,8), %xmm12
mulsd %xmm2, %xmm12
addsd %xmm11, %xmm12
movsd -0x18(%rdx,%rax,8), %xmm11
mulsd %xmm2, %xmm11
addsd %xmm12, %xmm11
addsd -0x20(%rdx,%rax,8), %xmm11
movsd (%rcx,%rsi,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(%r10)
movsd (%r8,%rsi,8), %xmm10
movsd -0x8(%r8,%rax,8), %xmm11
movsd 0x3eec(%rip), %xmm9     # 0x8a68
movsd (%rdx,%rsi,8), %xmm12
mulsd %xmm9, %xmm12
movsd -0x8(%rdx,%rax,8), %xmm13
mulsd %xmm3, %xmm13
addsd %xmm12, %xmm13
subsd -0x18(%rdx,%rax,8), %xmm13
mulsd -0x8(%rcx,%rax,8), %xmm6
addsd %xmm10, %xmm11
mulsd %xmm13, %xmm6
mulsd %xmm5, %xmm11
addsd %xmm6, %xmm11
addsd -0x18(%r8,%rax,8), %xmm10
mulsd %xmm8, %xmm10
addsd %xmm11, %xmm10
movsd %xmm10, 0x18(%r10)
movsd -0x8(%r8,%rax,8), %xmm6
addsd -0x10(%r8,%rax,8), %xmm6
mulsd %xmm7, %xmm6
movq -0x8(%rdi,%rax,8), %r10
movsd %xmm6, (%r10)
movsd -0x8(%r8,%rax,8), %xmm7
addsd (%r8,%rsi,8), %xmm7
mulsd (%rcx,%rsi,8), %xmm5
movsd -0x8(%rdx,%rax,8), %xmm8
mulsd (%rdx,%rsi,8), %xmm9
mulsd %xmm3, %xmm8
addsd %xmm8, %xmm9
subsd -0x18(%rdx,%rax,8), %xmm9
mulsd %xmm5, %xmm9
addsd %xmm7, %xmm7
addsd %xmm9, %xmm7
movsd %xmm7, 0x8(%r10)
movsd -0x8(%r8,%rax,8), %xmm5
addsd (%r8,%rsi,8), %xmm5
mulsd -0x8(%rdx,%rax,8), %xmm4
addsd -0x18(%rdx,%rax,8), %xmm4
mulsd (%rdx,%rsi,8), %xmm2
addsd %xmm4, %xmm2
mulsd %xmm3, %xmm5
mulsd -0x8(%rcx,%rax,8), %xmm3
mulsd %xmm2, %xmm3
addsd %xmm5, %xmm3
movsd %xmm3, 0x10(%r10)
addsd %xmm7, %xmm7
movsd %xmm7, 0x8(%r10)
movq -0x10(%rdi,%rax,8), %rcx
addsd 0x10(%rcx), %xmm6
movsd %xmm6, 0x10(%rcx)
movsd (%r10), %xmm2
addsd %xmm2, %xmm2
movsd %xmm2, (%r10)
testl %eax, %eax
jle 0x4d09
movapd %xmm1, %xmm2
mulsd %xmm1, %xmm2
mulsd %xmm1, %xmm2
mulsd %xmm1, %xmm2
divsd %xmm2, %xmm0
xorl %ecx, %ecx
movapd 0x249d(%rip), %xmm1     # 0x7150
movq (%rdi,%rcx,8), %rdx
xorl %esi, %esi
movsd (%r9), %xmm2
xorpd %xmm1, %xmm2
mulsd (%rdx,%rsi,8), %xmm2
mulsd %xmm0, %xmm2
movsd %xmm2, (%rdx,%rsi,8)
incq %rsi
cmpq $0x5, %rsi
jne 0x4cb9
incq %rcx
cmpq %rax, %rcx
jne 0x4cb3
testl %eax, %eax
jle 0x4d09
xorl %ecx, %ecx
movsd 0x2331(%rip), %xmm0     # 0x7020
movq (%rdi,%rcx,8), %rdx
movsd 0x10(%rdx), %xmm1
addsd %xmm0, %xmm1
movsd %xmm1, 0x10(%rdx)
incq %rcx
cmpq %rcx, %rax
jne 0x4cef
popq %rbx
popq %r14
retq