LLVMValueRef gen_assign_cast(compile_t* c, LLVMTypeRef l_type, LLVMValueRef r_value, ast_t* type) { if(r_value <= GEN_NOVALUE) return r_value; LLVMTypeRef r_type = LLVMTypeOf(r_value); if(r_type == l_type) return r_value; switch(LLVMGetTypeKind(l_type)) { case LLVMIntegerTypeKind: case LLVMHalfTypeKind: case LLVMFloatTypeKind: case LLVMDoubleTypeKind: return gen_unbox(c, type, r_value); case LLVMPointerTypeKind: r_value = gen_box(c, type, r_value); if(r_value == NULL) return NULL; return LLVMBuildBitCast(c->builder, r_value, l_type, ""); case LLVMStructTypeKind: if(LLVMGetTypeKind(r_type) == LLVMPointerTypeKind) r_value = gen_unbox(c, type, r_value); return assign_to_tuple(c, l_type, r_value, type); default: {} } assert(0); return NULL; }
static char *insert_mols(const char *mol_insrt, int nmol_insrt, int ntry, int seed, t_atoms *atoms, rvec **x, real **r, int ePBC, matrix box, gmx_atomprop_t aps, real r_distance, real rshell, const output_env_t oenv) { t_pbc pbc; static char *title_insrt; t_atoms atoms_insrt; rvec *x_insrt, *x_n; real *r_insrt; int ePBC_insrt; matrix box_insrt; int i, mol, onr; real alfa, beta, gamma; rvec offset_x; int trial; set_pbc(&pbc, ePBC, box); /* read number of atoms of insert molecules */ get_stx_coordnum(mol_insrt, &atoms_insrt.nr); if (atoms_insrt.nr == 0) { gmx_fatal(FARGS, "No molecule in %s, please check your input\n", mol_insrt); } /* allocate memory for atom coordinates of insert molecules */ snew(x_insrt, atoms_insrt.nr); snew(r_insrt, atoms_insrt.nr); snew(atoms_insrt.resinfo, atoms_insrt.nr); snew(atoms_insrt.atomname, atoms_insrt.nr); snew(atoms_insrt.atom, atoms_insrt.nr); atoms_insrt.pdbinfo = NULL; snew(x_n, atoms_insrt.nr); snew(title_insrt, STRLEN); /* read residue number, residue names, atomnames, coordinates etc. */ fprintf(stderr, "Reading molecule configuration \n"); read_stx_conf(mol_insrt, title_insrt, &atoms_insrt, x_insrt, NULL, &ePBC_insrt, box_insrt); fprintf(stderr, "%s\nContaining %d atoms in %d residue\n", title_insrt, atoms_insrt.nr, atoms_insrt.nres); srenew(atoms_insrt.resinfo, atoms_insrt.nres); /* initialise van der waals arrays of insert molecules */ mk_vdw(&atoms_insrt, r_insrt, aps, r_distance); srenew(atoms->resinfo, (atoms->nres+nmol_insrt*atoms_insrt.nres)); srenew(atoms->atomname, (atoms->nr+atoms_insrt.nr*nmol_insrt)); srenew(atoms->atom, (atoms->nr+atoms_insrt.nr*nmol_insrt)); srenew(*x, (atoms->nr+atoms_insrt.nr*nmol_insrt)); srenew(*r, (atoms->nr+atoms_insrt.nr*nmol_insrt)); trial = mol = 0; while ((mol < nmol_insrt) && (trial < ntry*nmol_insrt)) { fprintf(stderr, "\rTry %d", trial++); for (i = 0; (i < atoms_insrt.nr); i++) { copy_rvec(x_insrt[i], x_n[i]); } alfa = 2*M_PI*rando( &seed); beta = 2*M_PI*rando( &seed); gamma = 2*M_PI*rando( &seed); rotate_conf(atoms_insrt.nr, x_n, NULL, alfa, beta, gamma); offset_x[XX] = box[XX][XX]*rando(&seed); offset_x[YY] = box[YY][YY]*rando(&seed); offset_x[ZZ] = box[ZZ][ZZ]*rando(&seed); gen_box(0, atoms_insrt.nr, x_n, box_insrt, offset_x, TRUE); if (!in_box(&pbc, x_n[0]) || !in_box(&pbc, x_n[atoms_insrt.nr-1])) { continue; } onr = atoms->nr; add_conf(atoms, x, NULL, r, FALSE, ePBC, box, TRUE, &atoms_insrt, x_n, NULL, r_insrt, FALSE, rshell, 0, oenv); if (atoms->nr == (atoms_insrt.nr+onr)) { mol++; fprintf(stderr, " success (now %d atoms)!", atoms->nr); } } srenew(atoms->resinfo, atoms->nres); srenew(atoms->atomname, atoms->nr); srenew(atoms->atom, atoms->nr); srenew(*x, atoms->nr); srenew(*r, atoms->nr); fprintf(stderr, "\n"); /* print number of molecules added */ fprintf(stderr, "Added %d molecules (out of %d requested) of %s\n", mol, nmol_insrt, *atoms_insrt.resinfo[0].name); return title_insrt; }
static char *insert_mols(char *mol_insrt,int nmol_insrt,int ntry,int seed, t_atoms *atoms,rvec **x,real **r,int ePBC,matrix box, gmx_atomprop_t aps,real r_distance,real rshell) { t_pbc pbc; static char *title_insrt; t_atoms atoms_insrt; rvec *x_insrt,*x_n; real *r_insrt; int ePBC_insrt; matrix box_insrt; int i,mol,onr; real alfa,beta,gamma; rvec offset_x; int try; set_pbc(&pbc,ePBC,box); /* read number of atoms of insert molecules */ get_stx_coordnum(mol_insrt,&atoms_insrt.nr); if (atoms_insrt.nr == 0) gmx_fatal(FARGS,"No molecule in %s, please check your input\n",mol_insrt); /* allocate memory for atom coordinates of insert molecules */ snew(x_insrt,atoms_insrt.nr); snew(r_insrt,atoms_insrt.nr); snew(atoms_insrt.resname,atoms_insrt.nr); snew(atoms_insrt.atomname,atoms_insrt.nr); snew(atoms_insrt.atom,atoms_insrt.nr); atoms_insrt.pdbinfo = NULL; snew(x_n,atoms_insrt.nr); snew(title_insrt,STRLEN); /* read residue number, residue names, atomnames, coordinates etc. */ fprintf(stderr,"Reading molecule configuration \n"); read_stx_conf(mol_insrt,title_insrt,&atoms_insrt,x_insrt,NULL, &ePBC_insrt,box_insrt); fprintf(stderr,"%s\nContaining %d atoms in %d residue\n", title_insrt,atoms_insrt.nr,atoms_insrt.nres); srenew(atoms_insrt.resname,atoms_insrt.nres); /* initialise van der waals arrays of insert molecules */ mk_vdw(&atoms_insrt,r_insrt,aps,r_distance); srenew(atoms->resname,(atoms->nres+nmol_insrt)); srenew(atoms->atomname,(atoms->nr+atoms_insrt.nr*nmol_insrt)); srenew(atoms->atom,(atoms->nr+atoms_insrt.nr*nmol_insrt)); srenew(*x,(atoms->nr+atoms_insrt.nr*nmol_insrt)); srenew(*r,(atoms->nr+atoms_insrt.nr*nmol_insrt)); try=mol=0; while ((mol < nmol_insrt) && (try < ntry*nmol_insrt)) { fprintf(stderr,"\rTry %d",try++); for (i=0;(i<atoms_insrt.nr);i++) { if (atoms_insrt.atom[i].resnr!=0) gmx_fatal(FARGS,"more then one residue in insert molecules\n" "program terminated\n"); copy_rvec(x_insrt[i],x_n[i]); } alfa=2*M_PI*rando(&seed); beta=2*M_PI*rando(&seed); gamma=2*M_PI*rando(&seed); rotate_conf(atoms_insrt.nr,x_n,NULL,alfa,beta,gamma); offset_x[XX]=box[XX][XX]*rando(&seed); offset_x[YY]=box[YY][YY]*rando(&seed); offset_x[ZZ]=box[ZZ][ZZ]*rando(&seed); gen_box(0,atoms_insrt.nr,x_n,box_insrt,offset_x,TRUE); if (!in_box(&pbc,x_n[0]) || !in_box(&pbc,x_n[atoms_insrt.nr-1])) continue; onr=atoms->nr; add_conf(atoms,x,NULL,r,FALSE,ePBC,box,TRUE, &atoms_insrt,x_n,NULL,r_insrt,FALSE,rshell,0); if (atoms->nr==(atoms_insrt.nr+onr)) { mol++; fprintf(stderr," success (now %d atoms)!",atoms->nr); } } srenew(atoms->resname, atoms->nres); srenew(atoms->atomname, atoms->nr); srenew(atoms->atom, atoms->nr); srenew(*x, atoms->nr); srenew(*r, atoms->nr); fprintf(stderr,"\n"); /* print number of molecules added */ fprintf(stderr,"Added %d molecules (out of %d requested) of %s\n", mol,nmol_insrt,*atoms_insrt.resname[0]); return title_insrt; } static void add_solv(char *fn,t_atoms *atoms,rvec **x,rvec **v,real **r, int ePBC,matrix box, gmx_atomprop_t aps,real r_distance,int *atoms_added, int *residues_added,real rshell,int max_sol) { int i,nmol; ivec n_box; char filename[STRLEN]; char title_solvt[STRLEN]; t_atoms *atoms_solvt; rvec *x_solvt,*v_solvt=NULL; real *r_solvt; int ePBC_solvt; matrix box_solvt; int onr,onres; strncpy(filename,libfn(fn),STRLEN); snew(atoms_solvt,1); get_stx_coordnum(filename,&(atoms_solvt->nr)); if (atoms_solvt->nr == 0) gmx_fatal(FARGS,"No solvent in %s, please check your input\n",filename); snew(x_solvt,atoms_solvt->nr); if (v) snew(v_solvt,atoms_solvt->nr); snew(r_solvt,atoms_solvt->nr); snew(atoms_solvt->resname,atoms_solvt->nr); snew(atoms_solvt->atomname,atoms_solvt->nr); snew(atoms_solvt->atom,atoms_solvt->nr); atoms_solvt->pdbinfo = NULL; fprintf(stderr,"Reading solvent configuration%s\n", v_solvt?" and velocities":""); read_stx_conf(filename,title_solvt,atoms_solvt,x_solvt,v_solvt, &ePBC_solvt,box_solvt); fprintf(stderr,"\"%s\"\n",title_solvt); fprintf(stderr,"solvent configuration contains %d atoms in %d residues\n", atoms_solvt->nr,atoms_solvt->nres); fprintf(stderr,"\n"); /* apply pbc for solvent configuration for whole molecules */ rm_res_pbc(atoms_solvt,x_solvt,box_solvt); /* initialise van der waals arrays of solvent configuration */ mk_vdw(atoms_solvt,r_solvt,aps,r_distance); /* calculate the box multiplication factors n_box[0...DIM] */ nmol=1; for (i=0; (i < DIM);i++) { n_box[i] = 1; while (n_box[i]*box_solvt[i][i] < box[i][i]) n_box[i]++; nmol*=n_box[i]; } fprintf(stderr,"Will generate new solvent configuration of %dx%dx%d boxes\n", n_box[XX],n_box[YY],n_box[ZZ]); /* realloc atoms_solvt for the new solvent configuration */ srenew(atoms_solvt->resname,atoms_solvt->nres*nmol); srenew(atoms_solvt->atomname,atoms_solvt->nr*nmol); srenew(atoms_solvt->atom,atoms_solvt->nr*nmol); srenew(x_solvt,atoms_solvt->nr*nmol); if (v_solvt) srenew(v_solvt,atoms_solvt->nr*nmol); srenew(r_solvt,atoms_solvt->nr*nmol); /* generate a new solvent configuration */ genconf(atoms_solvt,x_solvt,v_solvt,r_solvt,box_solvt,n_box); #ifdef DEBUG print_stat(x_solvt,atoms_solvt->nr,box_solvt); #endif #ifdef DEBUG print_stat(x_solvt,atoms_solvt->nr,box_solvt); #endif /* Sort the solvent mixture, not the protein... */ sort_molecule(&atoms_solvt,x_solvt,v_solvt,r_solvt); /* add the two configurations */ onr=atoms->nr; onres=atoms->nres; add_conf(atoms,x,v,r,TRUE,ePBC,box,FALSE, atoms_solvt,x_solvt,v_solvt,r_solvt,TRUE,rshell,max_sol); *atoms_added=atoms->nr-onr; *residues_added=atoms->nres-onres; sfree(x_solvt); sfree(r_solvt); fprintf(stderr,"Generated solvent containing %d atoms in %d residues\n", *atoms_added,*residues_added); }
static char *insert_mols(const char *mol_insrt, int nmol_insrt, int ntry, int seed, t_atoms *atoms, rvec **x, real **r, int ePBC, matrix box, gmx_atomprop_t aps, real r_distance, real r_scale, real rshell, const output_env_t oenv, const char* posfn, const rvec deltaR, int enum_rot, gmx_bool bCheckAllPairDist) { t_pbc pbc; static char *title_insrt; t_atoms atoms_insrt; rvec *x_insrt, *x_n; real *r_insrt; int ePBC_insrt; matrix box_insrt; int i, mol, onr, ncol; real alfa = 0., beta = 0., gamma = 0.; rvec offset_x; int trial; double **rpos; set_pbc(&pbc, ePBC, box); /* read number of atoms of insert molecules */ get_stx_coordnum(mol_insrt, &atoms_insrt.nr); if (atoms_insrt.nr == 0) { gmx_fatal(FARGS, "No molecule in %s, please check your input\n", mol_insrt); } /* allocate memory for atom coordinates of insert molecules */ snew(x_insrt, atoms_insrt.nr); snew(r_insrt, atoms_insrt.nr); snew(atoms_insrt.resinfo, atoms_insrt.nr); snew(atoms_insrt.atomname, atoms_insrt.nr); snew(atoms_insrt.atom, atoms_insrt.nr); atoms_insrt.pdbinfo = NULL; snew(x_n, atoms_insrt.nr); snew(title_insrt, STRLEN); /* read residue number, residue names, atomnames, coordinates etc. */ fprintf(stderr, "Reading molecule configuration \n"); read_stx_conf(mol_insrt, title_insrt, &atoms_insrt, x_insrt, NULL, &ePBC_insrt, box_insrt); fprintf(stderr, "%s\nContaining %d atoms in %d residue\n", title_insrt, atoms_insrt.nr, atoms_insrt.nres); srenew(atoms_insrt.resinfo, atoms_insrt.nres); /* initialise van der waals arrays of insert molecules */ mk_vdw(&atoms_insrt, r_insrt, aps, r_distance, r_scale); /* With -ip, take nmol_insrt from file posfn */ if (posfn != NULL) { nmol_insrt = read_xvg(posfn, &rpos, &ncol); if (ncol != 3) { gmx_fatal(FARGS, "Expected 3 columns (x/y/z coordinates) in file %s\n", ncol, posfn); } fprintf(stderr, "Read %d positions from file %s\n\n", nmol_insrt, posfn); } srenew(atoms->resinfo, (atoms->nres+nmol_insrt*atoms_insrt.nres)); srenew(atoms->atomname, (atoms->nr+atoms_insrt.nr*nmol_insrt)); srenew(atoms->atom, (atoms->nr+atoms_insrt.nr*nmol_insrt)); srenew(*x, (atoms->nr+atoms_insrt.nr*nmol_insrt)); srenew(*r, (atoms->nr+atoms_insrt.nr*nmol_insrt)); trial = mol = 0; while ((mol < nmol_insrt) && (trial < ntry*nmol_insrt)) { fprintf(stderr, "\rTry %d", trial++); for (i = 0; (i < atoms_insrt.nr); i++) { copy_rvec(x_insrt[i], x_n[i]); } switch (enum_rot) { case en_rotXYZ: alfa = 2*M_PI *rando(&seed); beta = 2*M_PI *rando(&seed); gamma = 2*M_PI *rando(&seed); break; case en_rotZ: alfa = beta = 0.; gamma = 2*M_PI*rando(&seed); break; case en_rotNone: alfa = beta = gamma = 0.; break; } if (enum_rot == en_rotXYZ || (enum_rot == en_rotZ)) { rotate_conf(atoms_insrt.nr, x_n, NULL, alfa, beta, gamma); } if (posfn == NULL) { /* insert at random positions */ offset_x[XX] = box[XX][XX]*rando(&seed); offset_x[YY] = box[YY][YY]*rando(&seed); offset_x[ZZ] = box[ZZ][ZZ]*rando(&seed); gen_box(0, atoms_insrt.nr, x_n, box_insrt, offset_x, TRUE); if (!in_box(&pbc, x_n[0]) || !in_box(&pbc, x_n[atoms_insrt.nr-1])) { continue; } } else { /* Insert at positions taken from option -ip file */ offset_x[XX] = rpos[XX][mol] + deltaR[XX]*(2*rando(&seed)-1); offset_x[YY] = rpos[YY][mol] + deltaR[YY]*(2*rando(&seed)-1); offset_x[ZZ] = rpos[ZZ][mol] + deltaR[ZZ]*(2*rando(&seed)-1); for (i = 0; i < atoms_insrt.nr; i++) { rvec_inc(x_n[i], offset_x); } } onr = atoms->nr; /* This is a (maybe) slow workaround to avoid too many calls of add_conf, which * leaks memory (status May 2012). If the momory leaks in add_conf() are fixed, * this check could be removed. Note, however, that allPairsDistOk is probably * even faster than add_conf() when inserting a small molecule into a moderately * small system. */ if (bCheckAllPairDist && !allPairsDistOk(atoms, *x, *r, ePBC, box, &atoms_insrt, x_n, r_insrt)) { continue; } add_conf(atoms, x, NULL, r, FALSE, ePBC, box, TRUE, &atoms_insrt, x_n, NULL, r_insrt, FALSE, rshell, 0, oenv); if (atoms->nr == (atoms_insrt.nr+onr)) { mol++; fprintf(stderr, " success (now %d atoms)!\n", atoms->nr); } } srenew(atoms->resinfo, atoms->nres); srenew(atoms->atomname, atoms->nr); srenew(atoms->atom, atoms->nr); srenew(*x, atoms->nr); srenew(*r, atoms->nr); fprintf(stderr, "\n"); /* print number of molecules added */ fprintf(stderr, "Added %d molecules (out of %d requested) of %s\n", mol, nmol_insrt, *atoms_insrt.resinfo[0].name); return title_insrt; }