// File: /workspace/github_c_makefile_star2_O0/ugobas[P]tnm/anharmonic_tnm.c
// Function: Energy_covalent
double Energy_covalent(float *r, atom *atoms, int natoms,
		       struct bond *bonds)
{
  int i, j;
  if(INI_COV==0){
    INI_COV=1;
    int nmax=2*natoms;
    Int_list_cov=malloc(nmax*sizeof(struct interaction));
    struct interaction *Int_cov=Int_list_cov; int n=0;
    struct bond *bond=bonds;
    for(i=0; i<natoms; i++){
      if(bond->previous && bond->len<0){
	Int_cov->i1=bond->i_atom; Int_cov->i2=bond->previous->i_atom;
	if(Dist_thr(Int_cov, atoms)){
	  Int_cov->sec_der=E_COV_FACT; Int_cov++; n++;
	}
	if(bond->previous->previous && bond->angle<0){
	  Int_cov->i1=bond->i_atom;
	  Int_cov->i2=bond->previous->previous->i_atom;
	  if(Dist_thr(Int_cov, atoms)){
	    Int_cov->sec_der=E_COV_FACT; Int_cov++; n++;
	  }
	}
	if(n>nmax){printf("ERROR too many covalent bonds\n"); exit(8);}
      }
      bond++;
    }
    printf("%d covalent bonds stored for %d atoms\n", n, natoms);
    N_cov=n;
    Compute_sec_der(Int_list_cov, N_cov, NULL);
    double E_rep_tmp=E_repulsion; E_repulsion*=E_COV_FACT;
    Assign_interactions_SB(Int_list_cov, N_cov, NULL, NULL);
    E_repulsion=E_rep_tmp;

    Ene_cov_ini=0; Int_cov=Int_list_cov;
    for(i=0; i<N_cov; i++){
      Ene_cov_ini+=Compute_V(Int_cov, Int_cov->r0);
      Int_cov++;
    }
  } // End initialization of the energy

  double Ene_cov=0; struct interaction *Int_cov=Int_list_cov;
  for(i=0; i<N_cov; i++){
    double d2=0, d;
    float *r1=r+3*Int_cov->i1, *r2=r+3*Int_cov->i2;
    for(j=0; j<3; j++){d=r1[j]-r2[j]; d*=d; d2+=d;}
    Ene_cov+=Compute_V(Int_cov, sqrt(d2));
    Int_cov++;
  }
  return(Ene_cov-Ene_cov_ini);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl %edx, -0x14(%rbp)
movq %rcx, -0x20(%rbp)
cmpl $0x0, 0x7574f(%rip)     # 0x9c250
jne 0x26d94
movl $0x1, 0x7573f(%rip)     # 0x9c250
movl -0x14(%rbp), %eax
shll %eax
movl %eax, -0x2c(%rbp)
movslq -0x2c(%rbp), %rax
imulq $0xc8, %rax, %rdi
callq 0x1180
movq %rax, 0x75780(%rip)     # 0x9c2b0
movq 0x75779(%rip), %rax     # 0x9c2b0
movq %rax, -0x38(%rbp)
movl $0x0, -0x3c(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x48(%rbp)
movl $0x0, -0x24(%rbp)
movl -0x24(%rbp), %eax
cmpl -0x14(%rbp), %eax
jge 0x26c89
movq -0x48(%rbp), %rax
cmpq $0x0, 0x28(%rax)
je 0x26c6d
movq -0x48(%rbp), %rax
cmpl $0x0, 0x34(%rax)
jge 0x26c6d
movq -0x48(%rbp), %rax
movl 0x20(%rax), %ecx
movq -0x38(%rbp), %rax
movl %ecx, (%rax)
movq -0x48(%rbp), %rax
movq 0x28(%rax), %rax
movl 0x20(%rax), %ecx
movq -0x38(%rbp), %rax
movl %ecx, 0x4(%rax)
movq -0x38(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x290d0
cmpl $0x0, %eax
je 0x26bd3
movsd 0x65295(%rip), %xmm0    # 0x8be48
movq -0x38(%rbp), %rax
movsd %xmm0, 0x28(%rax)
movq -0x38(%rbp), %rax
addq $0xc8, %rax
movq %rax, -0x38(%rbp)
movl -0x3c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3c(%rbp)
movq -0x48(%rbp), %rax
movq 0x28(%rax), %rax
cmpq $0x0, 0x28(%rax)
je 0x26c4b
movq -0x48(%rbp), %rax
cmpl $0x0, 0x38(%rax)
jge 0x26c4b
movq -0x48(%rbp), %rax
movl 0x20(%rax), %ecx
movq -0x38(%rbp), %rax
movl %ecx, (%rax)
movq -0x48(%rbp), %rax
movq 0x28(%rax), %rax
movq 0x28(%rax), %rax
movl 0x20(%rax), %ecx
movq -0x38(%rbp), %rax
movl %ecx, 0x4(%rax)
movq -0x38(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x290d0
cmpl $0x0, %eax
je 0x26c49
movsd 0x6521f(%rip), %xmm0    # 0x8be48
movq -0x38(%rbp), %rax
movsd %xmm0, 0x28(%rax)
movq -0x38(%rbp), %rax
addq $0xc8, %rax
movq %rax, -0x38(%rbp)
movl -0x3c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3c(%rbp)
jmp 0x26c4b
movl -0x3c(%rbp), %eax
cmpl -0x2c(%rbp), %eax
jle 0x26c6b
leaq 0x5607f(%rip), %rdi     # 0x7ccd9
movb $0x0, %al
callq 0x10d0
movl $0x8, %edi
callq 0x1210
jmp 0x26c6d
movq -0x48(%rbp), %rax
addq $0xc0, %rax
movq %rax, -0x48(%rbp)
movl -0x24(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x24(%rbp)
jmp 0x26b51
movl -0x3c(%rbp), %esi
movl -0x14(%rbp), %edx
leaq 0x56062(%rip), %rdi     # 0x7ccf8
movb $0x0, %al
callq 0x10d0
movl -0x3c(%rbp), %eax
movl %eax, 0x75612(%rip)     # 0x9c2b8
movq 0x75603(%rip), %rdi     # 0x9c2b0
movl 0x75605(%rip), %esi     # 0x9c2b8
xorl %eax, %eax
movl %eax, %edx
callq 0x20f20
leaq 0x653d5(%rip), %rax     # 0x8c098
movss (%rax), %xmm0
cvtss2sd %xmm0, %xmm0
movsd %xmm0, -0x50(%rbp)
movsd 0x65170(%rip), %xmm1    # 0x8be48
leaq 0x653b9(%rip), %rax     # 0x8c098
movss (%rax), %xmm0
cvtss2sd %xmm0, %xmm0
mulsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
leaq 0x653a2(%rip), %rax     # 0x8c098
movss %xmm0, (%rax)
movq 0x755af(%rip), %rdi     # 0x9c2b0
movl 0x755b1(%rip), %esi     # 0x9c2b8
xorl %eax, %eax
movl %eax, %ecx
movq %rcx, %rdx
callq 0x291e0
movsd -0x50(%rbp), %xmm0
cvtsd2ss %xmm0, %xmm0
leaq 0x65375(%rip), %rax     # 0x8c098
movss %xmm0, (%rax)
xorps %xmm0, %xmm0
movsd %xmm0, 0x7558e(%rip)    # 0x9c2c0
movq 0x75577(%rip), %rax     # 0x9c2b0
movq %rax, -0x38(%rbp)
movl $0x0, -0x24(%rbp)
movl -0x24(%rbp), %eax
cmpl 0x7556b(%rip), %eax     # 0x9c2b8
jge 0x26d92
movq -0x38(%rbp), %rdi
movq -0x38(%rbp), %rax
movsd 0x20(%rax), %xmm0
cvtsd2ss %xmm0, %xmm0
callq 0x27810
cvtss2sd %xmm0, %xmm0
addsd 0x7554f(%rip), %xmm0    # 0x9c2c0
movsd %xmm0, 0x75547(%rip)    # 0x9c2c0
movq -0x38(%rbp), %rax
addq $0xc8, %rax
movq %rax, -0x38(%rbp)
movl -0x24(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x24(%rbp)
jmp 0x26d44
jmp 0x26d94
xorps %xmm0, %xmm0
movsd %xmm0, -0x58(%rbp)
movq 0x7550d(%rip), %rax     # 0x9c2b0
movq %rax, -0x60(%rbp)
movl $0x0, -0x24(%rbp)
movl -0x24(%rbp), %eax
cmpl 0x75501(%rip), %eax     # 0x9c2b8
jge 0x26ea0
xorps %xmm0, %xmm0
movsd %xmm0, -0x68(%rbp)
movq -0x8(%rbp), %rax
movq -0x60(%rbp), %rcx
imull $0x3, (%rcx), %ecx
movslq %ecx, %rcx
shlq $0x2, %rcx
addq %rcx, %rax
movq %rax, -0x78(%rbp)
movq -0x8(%rbp), %rax
movq -0x60(%rbp), %rcx
imull $0x3, 0x4(%rcx), %ecx
movslq %ecx, %rcx
shlq $0x2, %rcx
addq %rcx, %rax
movq %rax, -0x80(%rbp)
movl $0x0, -0x28(%rbp)
cmpl $0x3, -0x28(%rbp)
jge 0x26e51
movq -0x78(%rbp), %rax
movslq -0x28(%rbp), %rcx
movss (%rax,%rcx,4), %xmm0
movq -0x80(%rbp), %rax
movslq -0x28(%rbp), %rcx
subss (%rax,%rcx,4), %xmm0
cvtss2sd %xmm0, %xmm0
movsd %xmm0, -0x70(%rbp)
movsd -0x70(%rbp), %xmm0
mulsd -0x70(%rbp), %xmm0
movsd %xmm0, -0x70(%rbp)
movsd -0x70(%rbp), %xmm0
addsd -0x68(%rbp), %xmm0
movsd %xmm0, -0x68(%rbp)
movl -0x28(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x28(%rbp)
jmp 0x26dff
movq -0x60(%rbp), %rax
movq %rax, -0x88(%rbp)
movsd -0x68(%rbp), %xmm0
callq 0x1220
movq -0x88(%rbp), %rdi
cvtsd2ss %xmm0, %xmm0
callq 0x27810
cvtss2sd %xmm0, %xmm0
addsd -0x58(%rbp), %xmm0
movsd %xmm0, -0x58(%rbp)
movq -0x60(%rbp), %rax
addq $0xc8, %rax
movq %rax, -0x60(%rbp)
movl -0x24(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x24(%rbp)
jmp 0x26dae
movsd -0x58(%rbp), %xmm0
subsd 0x75413(%rip), %xmm0    # 0x9c2c0
addq $0x90, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)