Ph.D. Candidate in Computational Chemistry at The State University of New York at Buffalo
I was born and raised in Kerman, Iran, 1995. The journey of my scientific career is full of curiosities :)
and I try to explain a small part of it chronologically.
Undergraduate Time - September 2013-February 2018
I've received my B.S. in Civil Engineering from
Shahid Bahonar University of Kerman (SBUK) in February 2018.
During this time in SBUK, I worked on a variety of experimental and computational projects one of which was
studying the effect of activated pozzolan with nano silica on natural pozzolan paste properties (link) in
the group of Prof. Reza Rahgozar.
I was also very interested in fundamental sciences like
mathematics and physics but there was no advanced course on that in Civil Engineering program. So, I started self-studying topics like
(numerical) linear algebra, elementary neural networks, ordinary and partial differential equations plus different numerical methods
for solving them such as finite difference, finite and boundary element, and spectral methods. MATLAB was the major programming language
I used during my undergrad and the "Spectral Methods in MATLAB"
by LN Trefethen was my favorite book. With MATLAB, I did the following:
• Designing an elementary autonomeous car that could adjust its acceleration based on
NGSIM data using
a feed-forward neural networks. This data was
denoised with wavelets and regenerated using Newtonian equations of motion.
• Automatizing steel connection design usin MATLAB outputing the design information into an Excel file in Farsi (Persian).
See the following videos on how I used MATLAB to design some parts of the steel structures.
• I also worked with C# designing
software
to interface with ETABS (a Civil Engineering software for
designing buildings), using its OpenAPI library
Master of Science - September 2018-February 2021
I started my M.S. in Nanomaterials Engineering in the same university under the supervision of
Prof. Gholam Reza Khayati,
Prof. Ahmad Irannejad, and
Prof. Shahriar Sharafi.
This program was held in the Material Science and Engineering department and
was a big shift in my scientific career as it was a completely different major from Civil Engineering and had few overlaps with the courses
I passed as an undergrad. During this time, I self-studied many of the quantum mechanical and quantum chemical concepts and started working
with different quantum chemistry codes such as Gaussian 09, Quantum Espresso, Siesta, and CP2K. I previosuly did not have any experience working
with Linux environment and since I was the first person working on quantum chemical topics in our department, I had to start from a very
zero point such as installing different codes and packages (even compilers) with different architectures on the university cluster but
I could handle these hard steps at that point. It took me 36 days to install CP2K :)
(there was no ChatGPT at that time) but it finally worked and I got a good skill in installation of different software packages on Linux!
Inspired by some works in Nano Letters and
Nature Communication,
I got familiared with PYXAID and decided to
add excited states dynamics calculations to my thesis.
In 2020, I started working remotely with
Prof. Alexey Akimov's group,
and started working on interfacing CP2K, Gaussian, and DFTB+ with
Libra code for studying the
excited states dynamics in nanomaterials. During this time, which I was still a graduate student in SBUK, we published two papers in
JCTC and
JPCL
performing NA-MD calculations for quantum dots and perovskite materials in the TD-DFT basis. My role was installation of CP2K on
UB CCR cluster and the development of a parallelized grid-based approach for overlap integration of molecular orbitals at different time step
(using Gaussian cube files) and extraction of the CP2K outputs for generating the energies, time-overlaps, and nonadiabatic couplings
in both single-particle and TD-DFT excitation bases.
Later in 2021, I started working on performing overlap integration in Gaussian type orbital (GTO) basis using
Libint2 code for a parallel and more efficient integral calculations.
We integrated this into the Libra code
and were able to perform NA-MD for very large systems such as silicon quantum dots with more than 1400 atoms and
carbon nitride monolayers with 5600 atoms using extended tight-binding approach. These works were published in
JCTC and
JPCC and
our work was featured on the JCTC cover.
Ph.D. - August 2022-Present
In Fall 2022, I attended at the University at Buffalo as a Ph.D. student in Chemistry. Since my first semester I was appointed as
a Research Assistant. Even though the advanced Chemistry courses were hard and I had no prior strong knowledge in them,
I could pass the first two semester with a GPA of 3.89/4.0. My works were also selected as the
graduate research highlights of the
Chemistry department. During the last 2 and a half year at UB, I've pulished five first-author and two
second-author papers and won the John Rys scholarship issued by the department of Chemistry.
In my second year, I started working on adopting machine-learning techniques in NA-MD simulations and introduced a simple yet novel approach
in which one could map the material's properties obtained from one level of theoy to another, effectively bypassing the SCF cycle.
With this approach we can predict the KS Fock matrix at a higher level of theory from the KS Fock matrix from a lower level of theory
e.g. mapping the non-SCF-PBE KS Fock matrix (1st iteration of SCF cycle) to a B3LYP or HSE06 one (final iteration of SCF cycle).
It showed almost perfect accuracy for electronic structure prediction of
nanoscale systems even when training the model with a simple kernel ridge regression (KRR) using few percentage of the data. We performed NA-MD in
the ML-generated molecular orbitals basis and it showed perfect match with the reference calculations.
I provided an easy-to-use interface for that in the Libra code
(see this tutorial).
This appraoch was published in JCTC. I presented this approach in the
MolSSI workshop on ML in
quantum and nonadiabatic dynamics on August 2024. It was also presented at
teh ACS 2024 Fall meeting at Denver and won the best poster presentation in the
Physical Chemistry division.
Since summer 2021, I have served as helper (software installation and support), instructor, and co-organizer of different workshops held at UB:
Excited States and Nonadiabatic Dynamics CyberTraining Workshop - Summer 2021 (remote)
Libra Winter School on Excited States and Nonadiabatic Dynamics in Materials - Winter 2022 (remote)
Excited States and Nonadiabatic Dynamics CyberTraining Workshop - Summer 2022 (remote)
Excited States and Nonadiabatic Dynamics CyberTraining Workshop - Summer 2023
Libra Workshop and Summer School on Excited States and Nonadiabatic Dynamics - Summer 2024
MolSSI workshop: “Machine-Learning in Quantum and Nonadiabatic Dynamics” - August 2024
Many of my instructions and presentation in the workshops was based on an extensive set of tutorials
I prepared on how to perform different types of calculations for NAD and ML:
Libra/CP2K interface Tutorials
CP2K Tutorials
Machine-Learning with KS Fock Mapping
Currently, I'm a Ph.D. candidate and passed the qualification exam and working on a variety of projects including differnt application of NA-MD
in collaboration with different groups and universities, NA-MD methodology assessments, and ML in NA-MD simulation projects.
All of these images are me but with different AlexNet convolutional
filters standing next to the AMAZING NIAGARA FALLS.
import torch
import torchvision.models as models
import torchvision.transforms as transforms
import torch.nn.functional as F
import matplotlib.pyplot as plt
from PIL import Image
# Load AlexNet Model
alexnet = models.alexnet(pretrained=True)
# Get First Conv Layer Filters
filters = alexnet.features[0].weight.data # Shape: (96, 3, 11, 11)
# Load and Preprocess an Image
image_path = "mammad1.jpg" # Replace with your image
transform = transforms.Compose([
transforms.Resize(256), # Resize for AlexNet input
transforms.CenterCrop(224), # Center crop
transforms.ToTensor(), # Convert to tensor
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # Normalize like ImageNet
])
image = Image.open(image_path).convert("RGB") # Open image
image = transform(image).unsqueeze(0) # Add batch dimension, shape (1, 3, 224, 224)
# Apply Each Filter to the Image
with torch.no_grad():
filtered_images = F.conv2d(image, filters, stride=1, padding=5)
fig, axes = plt.subplots(8, 8, figsize=(10, 10))
for i, ax in enumerate(axes.flat):
if i >= 64: break # Only show first 64 filters
filtered_img = filtered_images[0, i].cpu().numpy()
ax.imshow(np.abs(filtered_img), cmap="hot")
ax.set_xticks([])
ax.set_yticks([])
for spine in ax.spines.values():
spine.set_edgecolor("white")
spine.set_linewidth(1)
plt.subplots_adjust(wspace=0, hspace=0) # No horizontal or vertical spacing
plt.savefig("alexnet_images_3.jpg", bbox_inches='tight', dpi=600)
plt.show()