int traceVBI(int i, int j) { int VBIij_temp; int ip, jp, el, v; int ifinal, jfinal; ifinal = 0; jfinal = 0; for (ip = i + 1; ip < j - 1; ip++) { for (jp = ip + 1; jp < j; jp++) { if (check_iloop(i,j,ip,jp)) continue; el = eL(i, j, ip, jp); v = V(ip, jp); VBIij_temp = el + v; if (VBIij_temp == VBI(i,j)) { ifinal = ip; jfinal = jp; break; } } if (jp != j) break; } structure[ifinal] = jfinal; structure[jfinal] = ifinal; if (verbose==1) printf(" %12.2f\n", eL(i, j, ifinal, jfinal)/100.00); total_en += eL(i, j, ifinal, jfinal); int eVI = traceV(ifinal, jfinal); return eVI ; }
void NSEDataTraceService::traceRegurlarGrid( peano::applications::faxen::lbf::RegularGridBlockVertex** vertices, peano::applications::faxen::lbf::RegularGridBlockCell& cell, const tarch::la::Vector<DIMENSIONS,double>& centerPoint) { if(_isInitialized) { int indX = floor((centerPoint[0]-_xOffset)/_dx); int indY = floor((centerPoint[1]-_yOffset)/_dy); // std::cout << "cell center point: " << centerPoint << std::endl; // std::cout << "indX & indY: " << indX << ", " << indY << std::endl; // std::cout << "is trace u enabled: " << _traceU << std::endl; // std::cout << "is trace v enabled: " << _traceV << std::endl; // std::cout << "is trace p enabled: " << _traceP << std::endl; traceU(indX,indY,cell); traceV(indX,indY,cell); traceRHS(indX,indY,cell); traceP(indX,indY,cell); } }
int traceV(int i, int j) { int a, b, c, d, Vij; if (j-i < TURN) return INFINITY_; a = eH(i, j); b = eS(i, j) + V(i + 1, j - 1); if (eS(i, j) == 0) b = INFINITY_; c = VBI(i,j); d = VM(i,j); Vij = MIN(MIN(a, b), MIN(c, d)); if (Vij == a && Vij != b && Vij != c && Vij != d) { if (verbose == 1) printf("i %5d j %5d Hairpin %12.2f\n", i, j, eH(i, j)/100.00); total_en += eH(i,j); return Vij; } else if (Vij == b) { if (verbose == 1) printf("i %5d j %5d Stack %12.2f\n", i, j, eS(i, j)/100.00); total_en += eS(i,j); structure[i + 1] = j - 1; structure[j - 1] = i + 1; traceV(i + 1, j - 1); return Vij; } else if (Vij == c) { if (verbose == 1) printf("i %5d j %5d IntLoop ", i, j); traceVBI(i, j); return Vij; } else if (Vij == d && Vij != a && Vij != b && Vij != c) { int eVM = traceVM(i, j); if (verbose ==1) printf("i %5d j %5d MultiLoop %12.2f\n", i, j, (Vij-eVM)/100.0); total_en += (Vij-eVM); return Vij; } return 0; }
void traceW(int j) { int done = 0, i; int wim1, flag = 1 ; if (j == 0 || j == 1) return; for (i = 1; i < j && !done; i++) { if (j-i < TURN) continue; wim1 = MIN(0, W[i-1]); flag = 1; if ( wim1 != W[i-1] && canSSregion(0,i)) flag = 0; if (g_unamode||g_mismatch) { if ((W[j] == V(i,j) + auPenalty(i, j) + wim1 && canStack(i,j)) || forcePair(i,j)) { done = 1; if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop %12.2f\n", i, j, auPenalty(i, j)/100.00); total_ex += auPenalty(i, j); traceV(i, j); if (flag ) traceW(i - 1); break; } else if ((W[j] == V(i,j-1) + auPenalty(i,j-1) + Ed5(j-1,i,j) + wim1 && canSS(j) && canStack(i,j-1)) || forcePair(i, j-1)) { done = 1; if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop %12.2f\n", i, j-1, (auPenalty(i,j-1) + Ed5(j-1,i,j))/100.00); total_ex += (auPenalty(i,j-1) + Ed5(j-1,i,j)); traceV(i, j - 1); if (flag ) traceW(i - 1); break; } else if ((W[j] == V(i+1,j) + auPenalty(i+1,j) + Ed3(j,i+1,i) + wim1 && canSS(i) && canStack(i+1,j)) || forcePair(i+1,j)){ done = 1; if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop %12.2f\n", i+1, j, (auPenalty(i+1,j) + Ed3(j,i+1,i))/100.00); total_ex += (auPenalty(i+1,j) + Ed3(j,i+1,i)); traceV(i + 1, j); if (flag ) traceW(i - 1); break; } else if ((W[j] == V(i+1,j-1) + auPenalty(i+1, j-1) + Estacke(j-1,i+1) + wim1 && canSS(i) && canSS(j) && canStack(i+1,j-1)) || forcePair(i+1,j-1)) { done = 1; if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop %12.2f\n", i+1, j-1, (auPenalty(i+1, j-1) + Estacke(j-1,i+1))/100.00); total_ex += (auPenalty(i+1, j-1) + Estacke(j-1,i+1)); traceV(i + 1, j - 1); if (flag ) traceW(i - 1); break; } } else if (g_dangles == 2) { int e_dangles = 0; if (i>1) e_dangles += Ed3(j,i,i-1); if (j<length) e_dangles += Ed5(j,i,j+1); if ((W[j] == V(i,j) + auPenalty(i, j) + e_dangles + wim1 && canSS(i) && canSS(j) && canStack(i+1,j-1)) || forcePair(i+1,j-1)) { done = 1; if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop %12.2f\n", i+1, j-1, (auPenalty(i, j) + e_dangles)/100.00); total_ex += (auPenalty(i, j) + e_dangles); traceV(i, j); if (flag ) traceW(i - 1); break; } } else if (g_dangles == 0) { if ((W[j] == V(i,j) + auPenalty(i, j) + wim1 && canStack(i,j)) || forcePair(i,j)) { done = 1; if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop %12.2f\n", i, j, auPenalty(i, j)/100.00); total_ex += auPenalty(i, j); traceV(i, j); if (flag ) traceW(i - 1); break; } } else { // default if ((W[j] == V(i,j) + auPenalty(i, j) + wim1 && canStack(i,j)) || forcePair(i,j)) { done = 1; if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop %12.2f\n", i, j, auPenalty(i, j)/100.00); total_ex += auPenalty(i, j); traceV(i, j); if (flag ) traceW(i - 1); break; } else if ((W[j] == V(i,j-1) + auPenalty(i,j-1) + Ed5(j-1,i,j) + wim1 && canSS(j) && canStack(i,j-1)) || forcePair(i, j-1)) { done = 1; if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop %12.2f\n", i, j-1, (auPenalty(i,j-1) + Ed5(j-1,i,j))/100.00); total_ex += (auPenalty(i,j-1) + Ed5(j-1,i,j)); traceV(i, j - 1); if (flag ) traceW(i - 1); break; } else if ((W[j] == V(i+1,j) + auPenalty(i+1,j) + Ed3(j,i+1,i) + wim1 && canSS(i) && canStack(i+1,j)) || forcePair(i+1,j)){ done = 1; if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop %12.2f\n", i+1, j, (auPenalty(i+1,j) + Ed3(j,i+1,i))/100.00); total_ex += (auPenalty(i+1,j) + Ed3(j,i+1,i)); traceV(i + 1, j); if (flag ) traceW(i - 1); break; } else if ((W[j] == V(i+1,j-1) + auPenalty(i+1, j-1) + Ed3(j-1,i+1,i) + Ed5(j-1,i+1,j) + wim1 && canSS(i) && canSS(j) && canStack(i+1,j-1)) || forcePair(i+1,j-1)) { done = 1; if (print_energy_decompose == 1) fprintf(energy_decompose_outfile, "i %5d j %5d ExtLoop %12.2f\n", i+1, j-1, (auPenalty(i+1, j-1) + Ed3(j-1,i+1,i) + Ed5(j-1,i+1,j))/100.00); total_ex += (auPenalty(i+1, j-1) + Ed3(j-1,i+1,i) + Ed5(j-1,i+1,j)); traceV(i + 1, j - 1); if (flag ) traceW(i - 1); break; } } } if (W[j] == W[j - 1] && !done) traceW(j-1); //if (!done) { // fprintf(stderr, "ERROR: W(%d) could not be traced\n", j); //} return; }
int traceWM(int i, int j) { assert(i < j); int done=0, eWM=0; if (!done && WM(i,j) == WMPrime[i][j]) { eWM += traceWMPrime(i,j); done = 1; } if (!done){ if (g_unamode||g_mismatch) { if (WM(i,j) == V(i,j) + auPenalty(i, j) + Eb && canStack(i,j)) { eWM += traceV(i, j); done = 1; } else if (WM(i,j) == V(i+1, j) + Ed3(j,i + 1,i) + auPenalty(i+1, j) + Eb + Ec && canSS(i) && canStack(i+1,j)) { eWM += traceV(i + 1, j); done = 1; } else if (WM(i,j) == V(i,j-1) + Ed5(j-1,i,j) + auPenalty(i,j-1) + Eb + Ec && canSS(j) && canStack(i,j-1)) { done = 1; eWM += traceV(i, j - 1); } else if (WM(i,j) == V(i+1,j-1) + Estackm(j-1,i+1) + auPenalty(i+1, j-1) + Eb + 2*Ec && canSS(i) && canSS(j) && canStack(i+1,j-1)) { done = 1; eWM += traceV(i + 1, j - 1); } } else if (g_dangles == 2) { int energy = V(i,j) + auPenalty(i, j) + Eb; energy += (i==1)?Ed3(j,i,length):Ed3(j,i,i-1); /*if (j<len)*/ energy += Ed5(j,i,j+1); if (WM(i,j) == energy && canSS(i) && canSS(j) && canStack(i+1,j-1)) { eWM += traceV(i, j); done = 1; } } else if (g_dangles == 0) { if (WM(i,j) == V(i,j) + auPenalty(i, j) + Eb && canStack(i,j)) { eWM += traceV(i, j); done = 1; } } else { if (WM(i,j) == V(i,j) + auPenalty(i, j) + Eb && canStack(i,j)) { eWM += traceV(i, j); done = 1; } else if (WM(i,j) == V(i+1, j) + Ed3(j,i + 1,i) + auPenalty(i+1, j) + Eb + Ec && canSS(i) && canStack(i+1,j)) { eWM += traceV(i + 1, j); done = 1; } else if (WM(i,j) == V(i,j-1) + Ed5(j-1,i,j) + auPenalty(i,j-1) + Eb + Ec && canSS(j) && canStack(i,j-1)) { eWM += traceV(i, j - 1); done = 1; } else if (WM(i,j) == V(i+1,j-1) + Ed3(j-1,i+1,i) + Ed5(j-1,i+1,j) + auPenalty(i+1, j-1) + Eb + 2*Ec && canSS(i) && canSS(j) && canStack(i+1,j-1)) { eWM += traceV(i + 1, j - 1); done = 1; } } } if (!done){ if (WM(i,j) == WM(i + 1,j) + Ec && canSS(i)) { done = 1; eWM += traceWM(i + 1, j); } else if (WM(i,j) == WM(i,j - 1) + Ec && canSS(j)) { done = 1; eWM += traceWM(i, j - 1); } } if(!done) { fprintf(stderr, "ERROR: WM(%d,%d) could not be traced\n", i,j); } return eWM; }
void traceW(int j) { int done, i, Wj,Wj_temp; int wim1, flag, Widjd, Wijd, Widj, Wij; Wj = INFINITY_; flag = 1; done = 0; if (j == 0 || j == 1) return; for (i = 1; i < j && !done; i++) { if (j-i < TURN) continue; wim1 = MIN(0, W[i-1]); flag = 1; if (wim1 != W[i-1]) flag = 0; Widjd = Wijd = Widj = INFINITY_; Wij = V(i,j) + auPenalty(i, j) + wim1; Widjd =(check_base(i)&&check_base(j))?(V(i+1,j-1) + auPenalty(i+1, j-1) + Ed3(j-1,i+1,i) + Ed5(j-1,i+1,j) + wim1): INFINITY_; Wijd = (check_base(j))?(V(i,j-1) + auPenalty(i,j-1) + Ed5(j-1,i,j) + wim1):INFINITY_; Widj = (check_base(i))?(V(i+1,j) + auPenalty(i+1,j) + Ed3(j,i+1,i) + wim1):INFINITY_; Wj_temp=Wj; Wj = MIN(MIN(MIN(Wij, Widjd), MIN(Wijd, Widj)), Wj); if (W[j] == Wj) { if (W[j] == Wij) { done = 1; if (verbose == 1) printf("i %5d j %5d ExtLoop %12.2f\n", i, j, auPenalty(i, j)/100.00); total_ex += auPenalty(i, j); structure[i] = j; structure[j] = i; traceV(i, j); if (flag || is_ss(1,i)) traceW(i - 1); break; } else if (W[j] == Widjd && check_base(i) && check_base(j)) { done = 1; if (verbose == 1) printf("i %5d j %5d ExtLoop %12.2f\n", i+1, j-1, (auPenalty(i+1, j-1) + Ed3(j-1,i+1,i) + Ed5(j-1,i+1,j))/100.00); total_ex += (auPenalty(i+1, j-1) + Ed3(j-1,i+1,i) + Ed5(j-1,i+1,j)); structure[i + 1] = j - 1; structure[j - 1] = i + 1; traceV(i + 1, j - 1); if (flag || is_ss(1,i)) traceW(i - 1); break; } else if (W[j] == Wijd && check_base(j)) { done = 1; if (verbose == 1) printf("i %5d j %5d ExtLoop %12.2f\n", i, j-1, (auPenalty(i,j-1) + Ed5(j-1,i,j))/100.00); total_ex += (auPenalty(i,j-1) + Ed5(j-1,i,j)); structure[i] = j - 1; structure[j - 1] = i; traceV(i, j - 1); if (flag || is_ss(1,i)) traceW(i - 1); break; } else if (W[j] == Widj && check_base(i)) { done = 1; if (verbose == 1) printf("i %5d j %5d ExtLoop %12.2f\n", i+1, j, (auPenalty(i+1,j) + Ed3(j,i+1,i))/100.00); total_ex += (auPenalty(i+1,j) + Ed3(j,i+1,i)); structure[i + 1] = j; structure[j] = i + 1; traceV(i + 1, j); if (flag || is_ss(1,i)) traceW(i - 1); break; } } } if (W[j] == W[j - 1] && !done) traceW(j-1); return; }