使用Material Project时需要注意的能量修正问题

当我们在某些计算问题中需要比较Material Project(MP)的能量数据与本地DFT的计算结果时,如形成能的计算(https://blog.csdn.net/qq_36996539/article/details/128066249)。经过测试发现,即使在使用相同的输入参数的情况下,这两种方法得到的结果可能会有所不同。通过查阅Material Project官方文档,才发明很多人可能忽略了MP中对于能量进行的修正,这对于比较能量是非常重要的。

在MP中,为了提高其DFT计算的准确性,采用了两种修正:阴离子修正GGA/GGA+U混合修正

  1. 阴离子修正:
    • 对于许多在固体中呈负氧化态的元素,由于元素和固体之间电子定位的差异,从DFT计算得到的形成能可能存在显著的误差。这对于其标准状态为气态的元素尤为明显。
    • 为了解决这个问题,MP对14种阴离子应用了能量修正,包括“氧化物”(oxides)、“过氧化物”(peroxide)、“超氧化物”(superoxides)、S、F、Cl、Br、I、N、H、Se、Si、Sb和Te。
    • 对于含氧化物的化合物,根据氧在材料中的特定键合环境,分为氧化物、超氧化物和过氧化物的修正,根据最近邻键长确定的(超氧化物<1.35 Å,过氧化物<1.49 Å,否则为氧化物)。例如,Na2O接收’氧化物’修正,而NaO2接收超氧化物修正。
    • 只有当材料中被修正的元素作为阴离子时,才应用阴离子修正。例如,’H’修正应用于LiH,但不应用于H2O。如果估计的氧化态(如果可用)为负,或者它是材料中最具电负性的元素,那么它被分类为阴离子。
    • 具体数值可以参考参考文献1。
  2. GGA / GGA+U混合修正:
    • 众所周知,对于不同的化合物有些适用于+U修正计算,而其他化合物通常不采用。带有+U修正的能量与不带+U修正的能量不直接可比
    • MP中,GGA+U计算的结果添加了能量修正项,从而使得两种计算结果可以混合比较。

References:

  1. 1.A. Jain, G. Hautier, C. Moore, S.P. Ong, C.C. Fischer, T. Mueller, K.A. Persson, G. Ceder., A High-Throughput Infrastructure for Density Functional Theory Calculations, Computational Materials Science, vol. 50, 2011, pp. 2295-2310. DOI:10.1016/j.commatsci.2011.02.023
  2. 2.A. Jain, G. Hautier, S.P. Ong, C. Moore, C.C. Fischer, K.A. Persson, G. Ceder, Accurate Formation Enthalpies by Mixing GGA and GGA+U calculations, Physical Review B, vol. 84, 2011, p. 045115. DOI:10.1103/PhysRevB.84.045115
  3. Anion and GGA/GGA+U Mixing – Materials Project Documentation

漫画汉化中的一些批量处理(Adobe Photoshop&Python)

在做汉化过程中,经常会有一些批量处理的问题。一些简单的操作可以直接使用 Photoshop 解决,稍微复杂的问题使用 Python 的 Pillow 库会更加方便。

Photoshop 提供了一些非常简便的批量处理功能,在窗口—动作中可以通过使用软件预设的动作或者自行录制动作来实现一系列简单的重复动作。

在文件—自动—批处理中,就可以应用这些动作进行批量处理了。但是 Photoshop 自带的批处理并不是非常好用,使用起来局限性较大,效率也不理想。

只要熟悉 Python 的 Pillow 库,我们可以很快速的根据需求编写各种批量处理脚本,下面提供几个在实际汉化过程中用到的简单例子作为参考。

使用之前不要忘了安装 Pillow 库:

pip install Pillow

1.裁切并调整尺寸
def resize_and_crop_image(input_path, output_path, target_size):
    try:
        # 打开图像文件
        image = Image.open(input_path)

        # 计算缩放比例
        width_ratio = target_size[0] / image.width
        height_ratio = target_size[1] / image.height
        resize_ratio = min(width_ratio, height_ratio)

        # 计算缩放后的尺寸
        new_width = int(image.width * resize_ratio)
        new_height = int(image.height * resize_ratio)

        # 缩放图像
        image = image.resize((new_width, new_height), Image.ANTIALIAS)

        # 计算裁切的位置
        left = (new_width - target_size[0]) / 2
        top = (new_height - target_size[1]) / 2
        right = (new_width + target_size[0]) / 2
        bottom = (new_height + target_size[1]) / 2

        # 裁切图像
        image = image.crop((left, top, right, bottom))
        image.save(output_path, dpi=(600, 600))

        print(f"已处理文件: {input_path}")
    except Exception as e:
        print(f"处理文件{input_path}时出错: {str(e)}")

2.整页扫描时分页
def split_image(image_path):
    # 打开图片
    with Image.open(image_path) as img:
        # 获取图片的宽和高
        width, height = img.size
        
        # 计算中间位置
        middle = width // 2
        
        # 切割图片
        left_img = img.crop((0, 0, middle, height))
        right_img = img.crop((middle, 0, width, height))
        
        # 获取原始文件名中的两个数字
        base_name = os.path.splitext(image_path)[0]
        num1, num2 = base_name.split('、')
        
        # 保存切割后的图片
        left_img.save(f"{num1}.png")
        right_img.save(f"{num2}.png")

3.添加图片水印
def add_watermark(input_image_path, output_image_path, watermark_image_path, transparency, scale):
    original = Image.open(input_image_path)
    watermark = Image.open(watermark_image_path)
    watermark = watermark.convert("RGBA")

    # 设置透明度
    datas = watermark.getdata()
    new_data = []
    for item in datas:
        new_data.append((item[0], item[1], item[2], int(item[3] * transparency)))
    watermark.putdata(new_data)

    # 缩放
    watermark = watermark.resize((int(watermark.width * scale), int(watermark.height * scale)))

    # 将水印放在左下角
    original.paste(watermark, (0, original.height - watermark.height), watermark)
    original.save(output_image_path)
4.文字水印
def add_watermark(image_path, watermark_text, output_path):
    # 打开图片
    image = Image.open(image_path).convert("RGBA")
    
    # 字体和字体大小
    font = ImageFont.truetype("C:/Windows/Fonts/arial.ttf", 80)
    
    # 计算水印文字的宽和高
    text_width, text_height = ImageDraw.Draw(image).textsize(watermark_text, font)

    # 创建一个单独的水印图像
    watermark = Image.new('RGBA', (text_width, text_height), (255, 255, 255, 0))
    draw = ImageDraw.Draw(watermark)
    draw.text((0, 0), watermark_text, font=font, fill=(255, 255, 255, 100))

    # 旋转水印图像
    watermark = watermark.rotate(45, expand=1)

    # 获取图片的宽和高
    width, height = image.size

    # 创建一个可以在其上进行绘画的图像,初始颜色为透明
    txt = Image.new('RGBA', image.size, (255,255,255,0))

    # 将旋转后的水印复制到新创建的图像上
    for i in range(0, width, watermark.width):
        for j in range(0, height, watermark.height):
            txt.paste(watermark, (i, j), watermark)

    # 合并两个图片
    watermarked = Image.alpha_composite(image, txt)

    # 将RGBA模式转换为RGB模式
    watermarked = watermarked.convert("RGB")

    # 保存加了水印的图片
    watermarked.save(output_path)

给Surface Pro 8更换硬盘

1.一个老生常谈的问题,更换硬盘影响保修吗?

我咨询了微软客服,客服的说法是:虽然一般是不建议自行更换,但若是正常的更换没有损坏是不影响保修的。后续设备若是有出现功能问题需要保修的话,可以将原来的硬盘换回去恢复然后保修就正常保修了。

2.选择硬盘

Surface Pro 8的SSD规格是2230,这其实是一个非常尴尬的尺寸,零售的2230硬盘非常少,大部分都是OEM产品,再加上Steam Deck和Rog Ally 等掌机也采用了同样规格的硬盘,导致现在硬盘价格普遍跳水的情况下2230规格的硬盘大部分还比较坚挺,实际可以选择的型号不多。

2230规格大部分固态性能并不理想,目前的首选是SN740,算是平衡了性能和性价比最好的选择,而且也有南京梵多这种靠谱的西数代理店铺可以购买,保修也有了保障。但是奇葩的是Surface Pro 8唯独跟这款固态有着一些不兼容的问题,可能会存在蓝屏等问题,虽然确实有一些解决方案(或Github上面这个方案),但都不是完美的方案。倒是可以购买SN530作为替代,但是价格更高却有着更糟糕的性能实在是不太值得。另一个优选是PCIE3.0最强的2230固态BC711,但没有很好的购买渠道且价格一直居高不下,而且还出现了很多假货。其他选择还有铠侠的BG4和BG5。

权衡之下,我最后选择了三星的PM991,和我目前原创的256G硬盘是相同的型号。虽然在性能上比较逊色,但价格上确实比较实惠,而且也有相对比较靠谱的老店可以购买。

另外国产品牌也开始推出了一些2230固态,例如达墨的狮子座和幻隐的HV2000,还有梵想和海康威视等等牌子,如果叠加拼多多的各种优惠卷确实可能能做到不错的价格,但是来路不明的颗粒实在是不敢作为系统盘使用。希望这些品牌能够经受时间检验。

3.迁移数据or重装系统

如果需要保留机器数据,就需要准备一个硬盘盒来进行硬盘克隆了。这里我选择的是ITGZ的9210B双协议2230硬盘盒,虽然比起常见的JMS583主控价格稍微贵了一些,但是9210B主控确实在温度表现上更加出色。

之后安装DiskGenius官网的教程,使用免费版就可以使用的系统迁移功能就可以完成迁移了,整个过程非常简单。

如果不需要保留数据,只需要准备一个u盘进行重装就可以了。在微软官网就能下载用于重装的Surface恢复镜像,也不用担心丢失Windows激活。

4.拆机安装硬盘

Surface的硬盘槽就在机器背面,基本没有什么拆解难度,首先需要一个取卡针打开硬盘盖,然后需要一个T3规格的螺丝刀拧开SSD的固定螺丝就可以进行更换了。如果没有安装过固态硬盘,需要注意硬盘是斜着插入的,再通过螺丝固定放平。(因为之前没有想到用的是这么小的螺丝,没有准备对应的螺丝刀,因此紧急去小米之家买了一套小米精修螺丝刀,品质确实不错。)

5.后续问题

迁移硬盘后应用和数据都能正常使用,但BitLocker和Onedrive可能会出现一点问题。

Onedrive在重装后可能会在同步过程中出现一些问题,我按照官网教程(重置 OneDrive – Microsoft 支持)重置Onedrive,删除了无效的个人保管库快捷方式,就解决了。(注意这里微软官网教程犯了错误,应该是”C:\Program Files\Microsoft OneDrive\onedrive.exe” /reset)

BitLocker的问题就比较麻烦了,克隆硬盘后我就无法正常开启BitLocker了。我咨询了Surface官方客服和Windows客服都没有有效的解决方案,我尝试了清除TPM(更新安全处理器 (TPM) 固件 – Microsoft 支持)也没有解决。或许如果对BitLocker依赖高的话还是应该采用重装的方法。

手动编译安装gcc

代码用到了一些C++17特性,但由于集群上的GCC版本比较老旧,出现了一些难以解决的段错误,因此选择了自己手动编译一份新版本GCC来避免此类问题。编译GCC虽然不难,但是整体较为繁琐,因此在此记录一下以免遗忘。

GCC的构建需要GMP(GNU Multiple Precision Arithmetic Library,GNU多精度算术库)、MPFR(Multiple Precision Floating-Point Reliable,多精度浮点可靠库)和MPC(Multiple Precision Complex,多精度复数库)这三个库。首先需要先按顺序安装这些库,并在配置GCC时指定它们的路径。

继续阅读“手动编译安装gcc”

Docker Hub镜像的使用

很多之前提供docker镜像源的开源站的都失效了,目前搜索引擎排在前排的结果很多都无法使用,找了一圈,发现Github上有一个维护的列表非常实用,可以参考。

修改/etc/docker/daemon.json,添加如下内容即可:

{
 "registry-mirrors": [
        "镜像源地址",
        "镜像源地址"
    ]
}

双系统下的蓝牙键盘配对

罗技的K380键盘虽然在多设备之间切换非常方便,但很遗憾的是并不能很好的处理同一台设备多系统的情况。

对于macOS/Windows 10双系统的用户来讲,得益于bootcamp方便的设计,只需要在macOS下完成键盘连接,切换到Windows 10之后也依然可以正常使用键盘。

但对于Linux/Windows 10双系统用户则就需要手动进行修改,才可以实现相同的效果,以下是具体方法。

继续阅读“双系统下的蓝牙键盘配对”