// File: /workspace/github_c_makefile_star2_O0/ugobas[P]tnm/simulation.c
// Function: Write_RMSD
int Write_RMSD(float *reduce_step, float *RMSD_opt, float *RMSD_kf,
	       float STEP_MIN, float STEP_MAX, float factor, int iter,
	       FILE *file_rmsd,
	       struct bond *bonds, float *coord_all, int natoms1,
	       struct ali_atoms ali_a, float *coord_new, float *coord_old,
	       float *coord_ref_1, float *coord_ref_2)
{
  Put_coord(coord_all, bonds, natoms1);
  Write_ref_coord(coord_new, ali_a.N_ref, coord_all, ali_a.ali1);
  if(Check_nan_f(coord_new, ali_a.N_Cart, "ref_coord")){
    printf("ERROR nan!!!!\n");
    fprintf(file_rmsd, "# nan\n"); return(0);   
  }
  
  //  Compute rmsd and energy
  float RMSD_ki, RMSD_step;
  RMSD_ki=rmsd_mclachlan_f(coord_ref_1, coord_new, ali_a.mass, ali_a.N_ref);
  RMSD_step=rmsd_mclachlan_f(coord_old, coord_new, ali_a.mass, ali_a.N_ref);
  *RMSD_kf=rmsd_mclachlan_f(coord_ref_2, coord_new, ali_a.mass, ali_a.N_ref);
  
  // Check if RMSD improves
  int accept; //float RMSD_TAR=STEP_MAX*0.3333;
  if(RMSD_step<STEP_MIN){
    if((*RMSD_kf<*RMSD_opt)&&(factor==1.0)){
      accept=0; *reduce_step=2*(STEP_MIN/RMSD_step);
    }else{
      printf("Too small step\n");
      accept=0; *reduce_step=0.0;
    }
  }else if(*RMSD_kf<*RMSD_opt){
    /*if((RMSD_step<RMSD_TAR)&&(factor==1.0)){
      accept=0; *reduce_step=1.1*(RMSD_TAR/RMSD_step);
      }*/
    if((RMSD_step>STEP_MAX)&&(factor==1.0)){
      accept=0; *reduce_step=0.95*(STEP_MAX/RMSD_step);
    }else{
      accept=1; *reduce_step=1.;
    }
  }else{ // RMSD increases
    accept=0; *reduce_step=0.5;
  }
  if(accept)*RMSD_opt=*RMSD_kf;   

  printf("%2d round, rmsd= %.2f %.2f step= %.3f f= %.5f accept=%d\n",
	 iter+1, RMSD_ki, *RMSD_kf, RMSD_step, factor, accept);
  float Ene_new=Energy_clashes(coord_all, natoms1);
  if(accept==0)fprintf(file_rmsd, "#");
  fprintf(file_rmsd, "%.3f\t%.3f\t%.3f\t%.2g\t%.2g\t%d\n",
	  RMSD_ki, *RMSD_kf, RMSD_step, Ene_new, factor, accept);
  fflush(file_rmsd);
  return(accept);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq 0x58(%rbp), %rax
movq 0x50(%rbp), %rax
movq 0x48(%rbp), %rax
movq 0x40(%rbp), %rax
leaq 0x20(%rbp), %rax
movq %rax, -0x58(%rbp)
movl 0x18(%rbp), %eax
movq 0x10(%rbp), %rax
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movss %xmm0, -0x24(%rbp)
movss %xmm1, -0x28(%rbp)
movss %xmm2, -0x2c(%rbp)
movl %ecx, -0x30(%rbp)
movq %r8, -0x38(%rbp)
movq %r9, -0x40(%rbp)
movq 0x10(%rbp), %rdi
movq -0x40(%rbp), %rsi
movl 0x18(%rbp), %edx
callq 0x49770
movq -0x58(%rbp), %rax
movq 0x40(%rbp), %rdi
movl 0x18(%rax), %esi
movq 0x10(%rbp), %rdx
movq (%rax), %rcx
callq 0x4a1d0
movq -0x58(%rbp), %rax
movq 0x40(%rbp), %rdi
movl 0x1c(%rax), %esi
leaq 0x34332(%rip), %rdx     # 0x81028
callq 0x53880
cmpl $0x0, %eax
je 0x4cd2c
leaq 0x3432b(%rip), %rdi     # 0x81032
movb $0x0, %al
callq 0x10d0
movq -0x38(%rbp), %rdi
leaq 0x34328(%rip), %rsi     # 0x81041
movb $0x0, %al
callq 0x1150
movl $0x0, -0x4(%rbp)
jmp 0x4cf86
movq -0x58(%rbp), %rax
movq 0x50(%rbp), %rdi
movq 0x40(%rbp), %rsi
movq 0x10(%rax), %rdx
movl 0x18(%rax), %ecx
callq 0x70af0
movq -0x58(%rbp), %rax
cvtsd2ss %xmm0, %xmm0
movss %xmm0, -0x44(%rbp)
movq 0x48(%rbp), %rdi
movq 0x40(%rbp), %rsi
movq 0x10(%rax), %rdx
movl 0x18(%rax), %ecx
callq 0x70af0
movq -0x58(%rbp), %rax
cvtsd2ss %xmm0, %xmm0
movss %xmm0, -0x48(%rbp)
movq 0x58(%rbp), %rdi
movq 0x40(%rbp), %rsi
movq 0x10(%rax), %rdx
movl 0x18(%rax), %ecx
callq 0x70af0
cvtsd2ss %xmm0, %xmm0
movq -0x20(%rbp), %rax
movss %xmm0, (%rax)
movss -0x48(%rbp), %xmm1
movss -0x24(%rbp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x4ce1b
movq -0x20(%rbp), %rax
movss (%rax), %xmm1
movq -0x18(%rbp), %rax
movss (%rax), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x4cdf6
movss -0x2c(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x29281(%rip), %xmm1    # 0x76048
ucomisd %xmm1, %xmm0
jne 0x4cdf6
jp 0x4cdf6
movl $0x0, -0x4c(%rbp)
movss -0x24(%rbp), %xmm1
divss -0x48(%rbp), %xmm1
movss 0x292ac(%rip), %xmm0    # 0x76094
mulss %xmm1, %xmm0
movq -0x10(%rbp), %rax
movss %xmm0, (%rax)
jmp 0x4ce16
leaq 0x3424b(%rip), %rdi     # 0x81048
movb $0x0, %al
callq 0x10d0
movl $0x0, -0x4c(%rbp)
movq -0x10(%rbp), %rax
xorps %xmm0, %xmm0
movss %xmm0, (%rax)
jmp 0x4ceb5
movq -0x20(%rbp), %rax
movss (%rax), %xmm1
movq -0x18(%rbp), %rax
movss (%rax), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x4ce9c
movss -0x48(%rbp), %xmm0
ucomiss -0x28(%rbp), %xmm0
jbe 0x4ce83
movss -0x2c(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x291fc(%rip), %xmm1    # 0x76048
ucomisd %xmm1, %xmm0
jne 0x4ce83
jp 0x4ce83
movl $0x0, -0x4c(%rbp)
movss -0x28(%rbp), %xmm0
divss -0x48(%rbp), %xmm0
cvtss2sd %xmm0, %xmm1
movsd 0x331ff(%rip), %xmm0    # 0x80070
mulsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movq -0x10(%rbp), %rax
movss %xmm0, (%rax)
jmp 0x4ce9a
movl $0x1, -0x4c(%rbp)
movq -0x10(%rbp), %rax
movss 0x291fa(%rip), %xmm0    # 0x76090
movss %xmm0, (%rax)
jmp 0x4ceb3
movl $0x0, -0x4c(%rbp)
movq -0x10(%rbp), %rax
movss 0x291b9(%rip), %xmm0    # 0x76068
movss %xmm0, (%rax)
jmp 0x4ceb5
cmpl $0x0, -0x4c(%rbp)
je 0x4cecb
movq -0x20(%rbp), %rax
movss (%rax), %xmm0
movq -0x18(%rbp), %rax
movss %xmm0, (%rax)
movl -0x30(%rbp), %esi
addl $0x1, %esi
movss -0x44(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movq -0x20(%rbp), %rax
movss (%rax), %xmm1
cvtss2sd %xmm1, %xmm1
movss -0x48(%rbp), %xmm2
cvtss2sd %xmm2, %xmm2
movss -0x2c(%rbp), %xmm3
cvtss2sd %xmm3, %xmm3
movl -0x4c(%rbp), %edx
leaq 0x34156(%rip), %rdi     # 0x81058
movb $0x4, %al
callq 0x10d0
movq 0x10(%rbp), %rdi
movl 0x18(%rbp), %esi
callq 0x49810
movss %xmm0, -0x50(%rbp)
cmpl $0x0, -0x4c(%rbp)
jne 0x4cf32
movq -0x38(%rbp), %rdi
leaq 0x347ec(%rip), %rsi     # 0x81717
movb $0x0, %al
callq 0x1150
movq -0x38(%rbp), %rdi
movss -0x44(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movq -0x20(%rbp), %rax
movss (%rax), %xmm1
cvtss2sd %xmm1, %xmm1
movss -0x48(%rbp), %xmm2
cvtss2sd %xmm2, %xmm2
movss -0x50(%rbp), %xmm3
cvtss2sd %xmm3, %xmm3
movss -0x2c(%rbp), %xmm4
cvtss2sd %xmm4, %xmm4
movl -0x4c(%rbp), %edx
leaq 0x3359a(%rip), %rsi     # 0x8050a
movb $0x5, %al
callq 0x1150
movq -0x38(%rbp), %rdi
callq 0x1190
movl -0x4c(%rbp), %eax
movl %eax, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x60, %rsp
popq %rbp
retq
nop