608 t_slice_x x, t_slice_type type, t_slice_G G, t_neigh_list neigh_list,
609 int N_local, t_neigh_parallel neigh_op_tag, t_angle_parallel angle_op_tag )
611 Cabana::deep_copy( G, 0.0 );
613 Kokkos::RangePolicy<exe_space> policy( 0, N_local );
625 auto calc_radial_symm_op = KOKKOS_LAMBDA(
const int i,
const int j )
631 int memberindex, globalIndex;
633 T_F_FLOAT dxij, dyij, dzij;
635 int attype = type( i );
636 for (
int groupIndex = 0; groupIndex < numSFGperElem_( attype );
639 if ( SF_( attype, SFGmemberlist_( attype, groupIndex, 0 ), 1 ) ==
642 size_t memberindex0 = SFGmemberlist_( attype, groupIndex, 0 );
643 size_t e1 = SF_( attype, memberindex0, 2 );
644 double rc = SF_( attype, memberindex0, 7 );
646 SFGmemberlist_( attype, groupIndex, maxSFperElem_ );
649 dxij = ( x( i, 0 ) - x( j, 0 ) ) *
CFLENGTH * convLength_;
650 dyij = ( x( i, 1 ) - x( j, 1 ) ) *
CFLENGTH * convLength_;
651 dzij = ( x( i, 2 ) - x( j, 2 ) ) *
CFLENGTH * convLength_;
652 r2ij = dxij * dxij + dyij * dyij + dzij * dzij;
654 if ( e1 == nej && rij < rc )
658 for (
size_t k = 0; k < size; ++k )
660 memberindex = SFGmemberlist_( attype, groupIndex, k );
661 globalIndex = SF_( attype, memberindex, 14 );
662 eta = SF_( attype, memberindex, 4 );
663 rs = SF_( attype, memberindex, 8 );
664 G( i, globalIndex ) +=
665 exp( -eta * ( rij - rs ) * ( rij - rs ) ) * pfcij;
671 Cabana::neighbor_parallel_for(
672 policy, calc_radial_symm_op, neigh_list, Cabana::FirstNeighborsTag(),
673 neigh_op_tag,
"Mode::calculateRadialSymmetryFunctionGroups" );
676 auto calc_angular_symm_op =
677 KOKKOS_LAMBDA(
const int i,
const int j,
const int k )
679 double pfcij = 0.0, pdfcij = 0.0;
680 double pfcik = 0.0, pdfcik = 0.0;
681 double pfcjk = 0.0, pdfcjk = 0.0;
683 int memberindex, globalIndex;
684 double rij, r2ij, rik, r2ik, rjk, r2jk;
685 T_F_FLOAT dxij, dyij, dzij, dxik, dyik, dzik, dxjk, dyjk, dzjk;
686 double eta, rs, lambda, zeta;
688 int attype = type( i );
689 for (
int groupIndex = 0; groupIndex < numSFGperElem_( attype );
692 if ( SF_( attype, SFGmemberlist_( attype, groupIndex, 0 ), 1 ) ==
695 size_t memberindex0 = SFGmemberlist_( attype, groupIndex, 0 );
696 size_t e1 = SF_( attype, memberindex0, 2 );
697 size_t e2 = SF_( attype, memberindex0, 3 );
698 double rc = SF_( attype, memberindex0, 7 );
700 SFGmemberlist_( attype, groupIndex, maxSFperElem_ );
703 dxij = ( x( i, 0 ) - x( j, 0 ) ) *
CFLENGTH * convLength_;
704 dyij = ( x( i, 1 ) - x( j, 1 ) ) *
CFLENGTH * convLength_;
705 dzij = ( x( i, 2 ) - x( j, 2 ) ) *
CFLENGTH * convLength_;
706 r2ij = dxij * dxij + dyij * dyij + dzij * dzij;
708 if ( ( e1 == nej || e2 == nej ) && rij < rc )
716 if ( ( e1 == nej && e2 == nek ) ||
717 ( e2 == nej && e1 == nek ) )
720 ( x( i, 0 ) - x( k, 0 ) ) *
CFLENGTH * convLength_;
722 ( x( i, 1 ) - x( k, 1 ) ) *
CFLENGTH * convLength_;
724 ( x( i, 2 ) - x( k, 2 ) ) *
CFLENGTH * convLength_;
725 r2ik = dxik * dxik + dyik * dyik + dzik * dzik;
732 r2jk = dxjk * dxjk + dyjk * dyjk + dzjk * dzjk;
733 if ( r2jk < rc * rc )
737 pfcik, pdfcik, rik, rc,
false );
741 pfcjk, pdfcjk, rjk, rc,
false );
743 double const rinvijik = 1.0 / rij / rik;
744 double const costijk =
745 ( dxij * dxik + dyij * dyik +
748 double vexp = 0.0, rijs = 0.0, riks = 0.0,
750 for (
size_t l = 0; l < size; ++l )
754 SFGmemberlist_( attype,
757 memberindex = SFGmemberlist_(
758 attype, groupIndex, l );
759 eta = SF_( attype, memberindex, 4 );
760 lambda = SF_( attype, memberindex, 5 );
761 zeta = SF_( attype, memberindex, 6 );
762 rs = SF_( attype, memberindex, 8 );
768 vexp = exp( -eta * ( rijs * rijs +
774 ( r2ij + r2ik + r2jk ) );
775 double const plambda =
776 1.0 + lambda * costijk;
778 if ( plambda <= 0.0 )
781 fg *= pow( plambda, ( zeta - 1.0 ) );
782 G( i, globalIndex ) +=
783 fg * plambda * pfcij * pfcik * pfcjk;
792 Cabana::neighbor_parallel_for(
793 policy, calc_angular_symm_op, neigh_list, Cabana::SecondNeighborsTag(),
794 angle_op_tag,
"Mode::calculateAngularSymmetryFunctionGroups" );
797 auto scale_symm_op = KOKKOS_LAMBDA(
const int i )
799 int attype = type( i );
802 int memberindex, globalIndex;
803 double raw_value = 0.0;
804 for (
int groupIndex = 0; groupIndex < numSFGperElem_( attype );
807 memberindex0 = SFGmemberlist_( attype, groupIndex, 0 );
809 size_t size = SFGmemberlist_( attype, groupIndex, maxSFperElem_ );
810 for (
size_t k = 0; k < size; ++k )
813 attype, SFGmemberlist_( attype, groupIndex, k ), 14 );
814 memberindex = SFGmemberlist_( attype, groupIndex, k );
816 if ( SF_( attype, memberindex0, 1 ) == 2 )
817 raw_value = G( i, globalIndex );
818 else if ( SF_( attype, memberindex0, 1 ) == 3 )
820 G( i, globalIndex ) *
821 pow( 2, ( 1 - SF_( attype, memberindex, 6 ) ) );
823 G( i, globalIndex ) =
824 scale( attype, raw_value, memberindex, SFscaling_ );
828 Kokkos::parallel_for(
"Mode::scaleSymmetryFunctionGroups", policy,
837 t_slice_type type, t_slice_G G, t_slice_dEdG dEdG, t_slice_E E,
int N_local )
844 Kokkos::RangePolicy<exe_space> policy( 0, N_local );
855 auto calc_nn_op = KOKKOS_LAMBDA(
const int atomindex )
857 int attype = type( atomindex );
859 int layer_0, layer_lminusone;
860 layer_0 = (int)numSFperElem_( attype );
862 for (
int k = 0; k < layer_0; ++k )
863 NN( atomindex, 0, k ) = G( atomindex, k );
865 for (
int l = 1; l < numLayers_; l++ )
868 layer_lminusone = layer_0;
870 layer_lminusone = numNeuronsPerLayer_( l - 1 );
872 for (
int i = 0; i < numNeuronsPerLayer_( l ); i++ )
875 for (
int j = 0; j < layer_lminusone; j++ )
876 dtmp += weights_( attype, l - 1, i, j ) *
877 NN( atomindex, l - 1, j );
878 dtmp += bias_( attype, l - 1, i );
881 NN( atomindex, l, i ) = dtmp;
882 dfdx( atomindex, l, i ) = 1.0;
884 else if ( AF_( l ) == 1 )
887 NN( atomindex, l, i ) = dtmp;
888 dfdx( atomindex, l, i ) = 1.0 - dtmp * dtmp;
893 E( atomindex ) = NN( atomindex, numLayers_ - 1, 0 );
896 for (
int k = 0; k < numNeuronsPerLayer_( 0 ); k++ )
898 for (
int i = 0; i < numNeuronsPerLayer_( 1 ); i++ )
899 inner( atomindex, 0, i ) =
900 weights_( attype, 0, i, k ) * dfdx( atomindex, 1, i );
902 for (
int l = 1; l < numHiddenLayers_ + 1; l++ )
904 for (
int i2 = 0; i2 < numNeuronsPerLayer_( l + 1 ); i2++ )
906 outer( atomindex, l - 1, i2 ) = 0.0;
908 for (
int i1 = 0; i1 < numNeuronsPerLayer_( l ); i1++ )
909 outer( atomindex, l - 1, i2 ) +=
910 weights_( attype, l, i2, i1 ) *
911 inner( atomindex, l - 1, i1 );
912 outer( atomindex, l - 1, i2 ) *=
913 dfdx( atomindex, l + 1, i2 );
915 if ( l < numHiddenLayers_ )
916 inner( atomindex, l, i2 ) =
917 outer( atomindex, l - 1, i2 );
920 dEdG( atomindex, k ) = outer( atomindex, numHiddenLayers_ - 1, 0 );
923 Kokkos::parallel_for(
"Mode::calculateAtomicNeuralNetworks", policy,
933 t_slice_x x, t_slice_f f_a, t_slice_type type, t_slice_dEdG dEdG,
934 t_neigh_list neigh_list,
int N_local, t_neigh_parallel neigh_op_tag,
935 t_angle_parallel angle_op_tag )
939 Kokkos::RangePolicy<exe_space> policy( 0, N_local );
951 auto calc_radial_force_op = KOKKOS_LAMBDA(
const int i,
const int j )
956 T_F_FLOAT dxij, dyij, dzij;
958 int memberindex, globalIndex;
960 int attype = type( i );
962 for (
int groupIndex = 0; groupIndex < numSFGperElem_( attype );
965 if ( SF_( attype, SFGmemberlist_( attype, groupIndex, 0 ), 1 ) ==
968 size_t memberindex0 = SFGmemberlist_( attype, groupIndex, 0 );
969 size_t e1 = SF_( attype, memberindex0, 2 );
970 double rc = SF_( attype, memberindex0, 7 );
972 SFGmemberlist_( attype, groupIndex, maxSFperElem_ );
974 size_t nej = type( j );
975 dxij = ( x( i, 0 ) - x( j, 0 ) ) *
CFLENGTH * convLength_;
976 dyij = ( x( i, 1 ) - x( j, 1 ) ) *
CFLENGTH * convLength_;
977 dzij = ( x( i, 2 ) - x( j, 2 ) ) *
CFLENGTH * convLength_;
978 r2ij = dxij * dxij + dyij * dyij + dzij * dzij;
980 if ( e1 == nej && rij < rc )
986 for (
size_t k = 0; k < size; ++k )
989 attype, SFGmemberlist_( attype, groupIndex, k ),
991 memberindex = SFGmemberlist_( attype, groupIndex, k );
992 eta = SF_( attype, memberindex, 4 );
993 rs = SF_( attype, memberindex, 8 );
994 double pexp = exp( -eta * ( rij - rs ) * ( rij - rs ) );
997 SFscaling_( attype, memberindex, 6 ) *
998 ( pdfcij - 2.0 * eta * ( rij - rs ) * pfcij ) *
1000 f_a( i, 0 ) -= ( dEdG( i, globalIndex ) *
1001 ( p1 * dxij ) *
CFFORCE * convForce_ );
1002 f_a( i, 1 ) -= ( dEdG( i, globalIndex ) *
1003 ( p1 * dyij ) *
CFFORCE * convForce_ );
1004 f_a( i, 2 ) -= ( dEdG( i, globalIndex ) *
1005 ( p1 * dzij ) *
CFFORCE * convForce_ );
1007 f_a( j, 0 ) += ( dEdG( i, globalIndex ) *
1008 ( p1 * dxij ) *
CFFORCE * convForce_ );
1009 f_a( j, 1 ) += ( dEdG( i, globalIndex ) *
1010 ( p1 * dyij ) *
CFFORCE * convForce_ );
1011 f_a( j, 2 ) += ( dEdG( i, globalIndex ) *
1012 ( p1 * dzij ) *
CFFORCE * convForce_ );
1018 Cabana::neighbor_parallel_for( policy, calc_radial_force_op, neigh_list,
1019 Cabana::FirstNeighborsTag(), neigh_op_tag,
1020 "Mode::calculateRadialForces" );
1023 auto calc_angular_force_op =
1024 KOKKOS_LAMBDA(
const int i,
const int j,
const int k )
1027 double pdfcij = 0.0;
1028 double pfcik, pdfcik, pfcjk, pdfcjk;
1030 double rij, r2ij, rik, r2ik, rjk, r2jk;
1031 T_F_FLOAT dxij, dyij, dzij, dxik, dyik, dzik, dxjk, dyjk, dzjk;
1032 double eta, rs, lambda, zeta;
1033 int memberindex, globalIndex;
1035 int attype = type( i );
1036 for (
int groupIndex = 0; groupIndex < numSFGperElem_( attype );
1039 if ( SF_( attype, SFGmemberlist_( attype, groupIndex, 0 ), 1 ) ==
1042 size_t memberindex0 = SFGmemberlist_( attype, groupIndex, 0 );
1043 size_t e1 = SF_( attype, memberindex0, 2 );
1044 size_t e2 = SF_( attype, memberindex0, 3 );
1045 double rc = SF_( attype, memberindex0, 7 );
1047 SFGmemberlist_( attype, groupIndex, maxSFperElem_ );
1050 dxij = ( x( i, 0 ) - x( j, 0 ) ) *
CFLENGTH * convLength_;
1051 dyij = ( x( i, 1 ) - x( j, 1 ) ) *
CFLENGTH * convLength_;
1052 dzij = ( x( i, 2 ) - x( j, 2 ) ) *
CFLENGTH * convLength_;
1053 r2ij = dxij * dxij + dyij * dyij + dzij * dzij;
1055 if ( ( e1 == nej || e2 == nej ) && rij < rc )
1062 if ( ( e1 == nej && e2 == nek ) ||
1063 ( e2 == nej && e1 == nek ) )
1066 ( x( i, 0 ) - x( k, 0 ) ) *
CFLENGTH * convLength_;
1068 ( x( i, 1 ) - x( k, 1 ) ) *
CFLENGTH * convLength_;
1070 ( x( i, 2 ) - x( k, 2 ) ) *
CFLENGTH * convLength_;
1071 r2ik = dxik * dxik + dyik * dyik + dzik * dzik;
1078 r2jk = dxjk * dxjk + dyjk * dyjk + dzjk * dzjk;
1079 if ( r2jk < rc * rc )
1083 pfcik, pdfcik, rik, rc,
true );
1087 pfcjk, pdfcjk, rjk, rc,
true );
1089 double const rinvijik = 1.0 / rij / rik;
1090 double const costijk =
1091 ( dxij * dxik + dyij * dyik +
1094 double const pfc = pfcij * pfcik * pfcjk;
1095 double const r2sum = r2ij + r2ik + r2jk;
1096 double const pr1 = pfcik * pfcjk * pdfcij / rij;
1097 double const pr2 = pfcij * pfcjk * pdfcik / rik;
1098 double const pr3 = pfcij * pfcik * pdfcjk / rjk;
1099 double vexp = 0.0, rijs = 0.0, riks = 0.0,
1101 for (
size_t l = 0; l < size; ++l )
1105 SFGmemberlist_( attype,
1108 memberindex = SFGmemberlist_(
1109 attype, groupIndex, l );
1110 rs = SF_( attype, memberindex, 8 );
1111 eta = SF_( attype, memberindex, 4 );
1112 lambda = SF_( attype, memberindex, 5 );
1113 zeta = SF_( attype, memberindex, 6 );
1119 vexp = exp( -eta * ( rijs * rijs +
1124 vexp = exp( -eta * r2sum );
1126 double const plambda =
1127 1.0 + lambda * costijk;
1129 if ( plambda <= 0.0 )
1132 fg *= pow( plambda, ( zeta - 1.0 ) );
1134 fg *= pow( 2, ( 1 - zeta ) ) *
1135 SFscaling_( attype, memberindex, 6 );
1136 double const pfczl = pfc * zeta * lambda;
1137 double factorDeriv =
1138 2.0 * eta / zeta / lambda;
1139 double const p2etapl =
1140 plambda * factorDeriv;
1146 ( rinvijik - costijk / r2ij -
1147 p2etapl * rijs / rij ) +
1151 ( rinvijik - costijk / r2ik -
1152 p2etapl * riks / rik ) +
1156 ( pfczl * ( rinvijik +
1157 p2etapl * rjks / rjk ) -
1162 p1 = fg * ( pfczl * ( rinvijik -
1166 p2 = fg * ( pfczl * ( rinvijik -
1171 ( pfczl * ( rinvijik + p2etapl ) -
1174 f_a( i, 0 ) -= ( dEdG( i, globalIndex ) *
1175 ( p1 * dxij + p2 * dxik ) *
1177 f_a( i, 1 ) -= ( dEdG( i, globalIndex ) *
1178 ( p1 * dyij + p2 * dyik ) *
1180 f_a( i, 2 ) -= ( dEdG( i, globalIndex ) *
1181 ( p1 * dzij + p2 * dzik ) *
1184 f_a( j, 0 ) += ( dEdG( i, globalIndex ) *
1185 ( p1 * dxij + p3 * dxjk ) *
1187 f_a( j, 1 ) += ( dEdG( i, globalIndex ) *
1188 ( p1 * dyij + p3 * dyjk ) *
1190 f_a( j, 2 ) += ( dEdG( i, globalIndex ) *
1191 ( p1 * dzij + p3 * dzjk ) *
1194 f_a( k, 0 ) += ( dEdG( i, globalIndex ) *
1195 ( p2 * dxik - p3 * dxjk ) *
1197 f_a( k, 1 ) += ( dEdG( i, globalIndex ) *
1198 ( p2 * dyik - p3 * dyjk ) *
1200 f_a( k, 2 ) += ( dEdG( i, globalIndex ) *
1201 ( p2 * dzik - p3 * dzjk ) *
1211 Cabana::neighbor_parallel_for( policy, calc_angular_force_op, neigh_list,
1212 Cabana::SecondNeighborsTag(), angle_op_tag,
1213 "Mode::calculateAngularForces" );