Distributed-memory parallel programming and its applications