研究两层(如无机表面与溶液、无机表面与聚合物、聚合物与聚合物)之间的相互作用时,需要跑分子动力学,并对其中每一帧的两层结构分别拆开进行能量计算,并执行上述减法。
轨迹长达数万帧时,手动操作可能得算1年,利用脚本只需不到1分钟。
全脚本展示:
#!perl# Author: Stephen Todd# This script calculates the interaction energy between two layers in a structure.# The layers have to be defined as sets called Layer 1 and Layer 2 - these are the# default names assigned by the Layer builder.# This also uses the default settings for Forcite - ie Universal with current charges.# You should change the settings if you want to use another forcefield or summation method.# This script also assumes that the surface area is in the AB-plane.# A study table is produced containing the layers, energies, interaction energy, and then# the interaction energy per angstrom^2.# Note. The input trajectory should have a large vaccuum, greater than the# cut-off you are using in the non-bond calculation.use strict;use MaterialsScript qw(:all);################################################################################## Begin user editable settings#my $filename = \"Layer\"; # Name of the trajectory without extensionmy $energySettings = [CurrentForcefield => \"COMPASS\"]; # Change the ff if neededModules->Forcite->ChangeSettings( $energySettings );## End user editable settings################################################################################## Defines the trajectory documentmy $doc = $Documents{\"$filename.xtd\"};# Create a new study table to hold the structures and energies and set the headingsmy $newStudyTable = Documents->New(\"$filename\".\"_IntEnergy.std\");my $calcSheet = $newStudyTable->Sheets->Item(0);$calcSheet->ColumnHeading(0) = \"$filename Cell\";$calcSheet->ColumnHeading(1) = \"Energy of $filename Cell\";$calcSheet->ColumnHeading(2) = \"Layer 1\";$calcSheet->ColumnHeading(3) = \"Energy of Layer 1\";$calcSheet->ColumnHeading(4) = \"Layer 2\";$calcSheet->ColumnHeading(5) = \"Energy of layer 2\";$calcSheet->ColumnHeading(6) = \"Interaction Energy\";$calcSheet->ColumnHeading(7) = \"Interaction Energy per angstrom^2\";# Get the total number of frames in the trajectorymy $numFrames = $doc->Trajectory->NumFrames;print \"Calculating interaction energy for $numFrames frames on $filename trajectory\\n\";# Calculates the area of the surface based on the surface being in the A-B planemy $length1 = $doc->Lattice3D->LengthA;my $length2 = $doc->Lattice3D->LengthB;my $surfaceArea = $length1 * $length2;print \"The surface area is $surfaceArea angstroms^2\\n\";# Initialise Forcite. If you want to change the settings, you can load them or# use a change settings command here.my $forcite = Modules->Forcite;# Starts to loop over the frames in the trajectoryfor ( my $count=1; $count<=$numFrames; $count++) {print \"Calculating energy for frame $count\\n\";# Define the frame of the trajectory$doc->Trajectorys->Item(0)->CurrentFrame = $count;# Create three documents to hold the temporary layersmy $allDoc = Documents->New(\"all.xsd\");my $layer1Doc = Documents->New(\"Layer1.xsd\");my $layer2Doc = Documents->New(\"Layer2.xsd\");# Create a copy of the structure in temporary documents and delete# the layers that you don\'t need.$allDoc->CopyFrom($doc);$layer1Doc->CopyFrom($doc);$layer1Doc->DisplayRange->Sets(\"Layer 2\")->Atoms->Delete;$layer2Doc->CopyFrom($doc);$layer2Doc->DisplayRange->Sets(\"Layer 1\")->Atoms->Delete;# Put the structures in a study table for safekeeping$calcSheet->Cell($count-1, 0) = $allDoc;$calcSheet->Cell($count-1, 2) = $layer1Doc;$calcSheet->Cell($count-1, 4) = $layer2Doc;#Calculate the energies for all the layers and put in the study table$forcite->Calculation->Run($allDoc, [Task => \'Energy\']);$calcSheet->Cell($count-1, 1) = $allDoc->PotentialEnergy;$forcite->Calculation->Run($layer1Doc, [Task => \'Energy\']);$calcSheet->Cell($count-1, 3) = $layer1Doc->PotentialEnergy;$forcite->Calculation->Run($layer2Doc, [Task => \'Energy\']);$calcSheet->Cell($count-1, 5) = $layer2Doc->PotentialEnergy;# Calculate the Interaction Energy from the cells in the Study Tablemy $totalEnergy = $calcSheet->Cell($count-1,1);my $layer1Energy = $calcSheet->Cell($count-1,3);my $layer2Energy = $calcSheet->Cell($count-1,5);my $interactionEnergy = $totalEnergy - ($layer1Energy + $layer2Energy);$calcSheet->Cell($count-1, 6) = $interactionEnergy;my $interactionEnergyArea = $interactionEnergy / $surfaceArea;$calcSheet->Cell($count-1, 7) = $interactionEnergyArea;# Discard the temporary documents$allDoc->Discard;$layer1Doc->Discard;$layer2Doc->Discard;}print \"Calculation complete.\\n\";
Materials Studio
领取方式
公众号后台留言“脚本”,下载该脚本及配合使用案例。
长按识别二维码回复:脚本
长按识别二维码回复:脚本
长按识别二维码回复:脚本
长按识别二维码回复“脚本”,免费获取